Как я применяю заполнение клавишей Tab на сценарий из какого-либо каталога?

У меня есть функция автозавершения удара _customcomplete то, что я хочу подать заявку на названный сценарий run.sh. Если я звоню complete -F _customcomplete ./run.sh, затем сценарий автозавершения хорошо работает, пока я нахожусь в том же каталоге и называю его с ./run.sh. Однако, если я иду, каждый выравнивает и называет его с ./scripts/run.sh, сценарий автозавершения не работает. Что еще более важно, если я нахожусь в другом каталоге с другим названным сценарием run.sh, сценарий автозавершения работает над тем, когда он не был должен.

Короче говоря, действительно ли возможно связать функцию автозавершения удара с определенным исполняемым файлом, а не строку вызова?

Вот полный упрощенный пример:

В completion.sh очень простой сценарий завершения, который всегда возвращает три опции: one two three:

_customcomplete() {
  local word="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "one two three" -- "$word") )
}

Я могу получить его с source completion.sh и может проверить, что это получило с type _customcomplete:

_customcomplete is a function
_customcomplete() {
  local word="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "one two three" -- "$word") )
}

В каталоге у меня есть две папки scripts и other, оба из которых содержат названный сценарий run.sh. Каждый просто echos параметры командной строки наряду с уникальным сообщением для дифференциации двух.

Давайте теперь попытаемся зарегистрировать функцию завершения к run.sh в scripts cd'ing в каталог сценариев и выполнение complete -F _customcomplete ./run.sh. Теперь я могу звонить ./run.sh и используйте заполнение клавишей Tab для наблюдения возможностей one two three. Однако, если я пытаюсь назвать его из каталога выше как ./scripts/run.sh, Я получаю предложения заполнения клавишей Tab файловой системы по умолчанию. Кроме того, если я cd в other, пользовательское заполнение клавишей Tab работает над тем сценарием также.

Изменение complete управляйте для соединения с любым видом глобального пути, только позволяет пользовательское заполнение клавишей Tab при использовании что точно тот же самый глобальный путь в качестве строки вызова. То, что я хочу произойти, должно смочь назвать сценарий любым относительным путем и иметь пользовательскую работу заполнения клавишей Tab как ожидалось.

1
задан 21 August 2019 в 06:37

1 ответ

Кажется, что Вы хотите создать завершение для конкретного экземпляра команды, независимо от того, как это называют (через полный или относительный путь), но не другие, которые могут совместно использовать то же имя, но быть расположены в другом месте.  , Например, Вы могли бы хотеть завершение для сценария, расположенного в ~/bin/example.sh, но нет /usr/bin/example.sh.

На основе Справочника Bash: 8.6 Программируемое Завершение, удар complete не имеет функциональности, которой Вы требуете, встроил.   Однако в Вашем _customcomplete функция, можно найти местоположение сценария названным, с помощью readlink, затем настройте COMPREPLY соответственно:

_customcomplete() {
    local CMD_NAME=`readlink -f "$1"`
    local word="${COMP_WORDS[COMP_CWORD]}"

    if [[ $CMD_NAME == '/home/user/bin/example.sh' ]] ; then
        COMPREPLY=( $(compgen -W "one two three" -- "$word") )
    fi
} &&

complete -F _customcomplete example.sh
0
ответ дан 7 December 2019 в 19:04

Другие вопросы по тегам:

Похожие вопросы: