Итак, я только начинаю узнавать о сценариях завершения bash и начал работать над одним из инструментов, которые использую все время. Сначала я создал сценарий, используя набор параметров:
_zf_comp()
{
local cur prev actions
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
actions="change configure create disable enable show"
COMPREPLY=($(compgen -W "${actions}" -- ${cur}))
return 0
}
complete -F _zf_comp zf
Это прекрасно работает. Далее я решил динамически создать список доступных действий. Я собрал следующую команду:
zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'
Что в основном делает следующее:
Приведенная выше команда производит:
$ zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'
change configure create disable enable show
$
Мне кажется, что он воспроизводит ту же самую строку, что и в моем исходном сценарии. Но когда я сделаю:
_zf_comp()
{
local cur prev actions
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
actions=`zf | grep "Providers and their actions:" -A 100 | grep -P "^\s*\033\[36m\s*zf" | awk '{gsub(/[[:space:]]*/, "", $3); print $3}' | sort | uniq | awk '{sub("\-", "\\-", $1); print $1}' | tr \\n " " | sed 's/^ *\(.*\) *$/\1/'`
COMPREPLY=($(compgen -W "${actions}" -- ${cur}))
return 0
}
complete -F _zf_comp zf
Мое автозаполнение начинает действовать. Во-первых, он не будет выполнять автозаполнение чего-либо с «n» в нем, а во-вторых, когда он выполняет автозаполнение (например, «zf create»), он не позволяет мне возвращаться к моей завершенной команде.
Первый вопрос, в котором я совершенно запутался. Второе, как я думаю, может быть связано с escape-символами цветного текста.
Любые идеи? Это сводит меня с ума!
Одна вещь, которую я считаю полезной, - это создать функцию отладки, которая выводит на другой терминал:
debug() { echo "$@" >/dev/pts/0; }; export -f de
Затем вы можете вызвать его из своей функции завершения с содержимым переменных и т. Д., И он не будет мешать своему собственному выводу, пока вы его тестируете.
Вы можете попробовать изменить свой tr
использовать кавычки и посмотреть, решит ли это вашу проблему "n":
tr '\n' ' '
Подключите выход вашего grep
через cat -v
чтобы узнать, не пропущены ли вам escape-последовательности.
Кроме того, это может ускорить процесс, если вы сможете избежать вызова большого количества внешних команд.