Bash выполняется из двух источников, папок и ключей из массива

Я пытаюсь определить функцию bash, mycd. Эта функция использует ассоциативный массив mycdar. Если ключ существует в массиве, функция изменит каталог на соответствующее значение ключа. Если ключ не существует, он будет изменен на каталог, указанный в командной строке.

Я хотел бы сделать это для завершения этой функции, как из их ключей связанного массива, так и из папок, существующих в текущем каталоге.

Спасибо.

Ответ 1

Сначала выполните команду:

mycd() { [ "${mycdar[$1]}" ] && cd "${mycdar[$1]}" || cd "$1"; }

Вторая команда завершения

_mycd() {
    local cur;
    _cd ;
    _get_comp_words_by_ref cur;
    COMPREPLY=($(
        printf "%s\n" "${!mycdar[@]}" |
            grep ^$cur)
        ${COMPREPLY[@]});
    }

Один массив:

declare -A mycdar
mycdar['docs']=/usr/share/doc
mycdar['home']=$HOME
mycdar['logs']=/var/log
mycdar['proc']=/proc
mycdar['root']=/
mycdar['tmp']=/tmp

Завершив привязку:

complete -F _mycd -o nospace mycd

Или для разрешения стандартного поведения построения пути:

complete -F _mycd -o nospace -o plusdirs mycd

Но это не будет работать против нашего массива путей mycdar.

Ответ 2

Оказывается, есть опция, которая соответствует полной функции, которая выполняет именно то, что задано:

complete -o plusdirs -o nospace -F _mycd mycd

В этом случае _mycd просто возвращает соответствующие элементы из ключей ассоциативного массива.