У меня есть функция автозавершения удара _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 как ожидалось.
Кажется, что Вы хотите создать завершение для конкретного экземпляра команды, независимо от того, как это называют (через полный или относительный путь), но не другие, которые могут совместно использовать то же имя, но быть расположены в другом месте. , Например, Вы могли бы хотеть завершение для сценария, расположенного в ~/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