Назад | Перейти на главную страницу

Справка по сценарию завершения Bash

Итак, я только начинаю узнавать о сценариях завершения 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-последовательности.

Кроме того, это может ускорить процесс, если вы сможете избежать вызова большого количества внешних команд.