Задача команды -C
- выяснить, какой текст вставлять в ответ на запрос завершения. Интерфейс немного странный:
Аргумент -C
интерпретируется как фрагмент сценария bash.Bash добавляет к этому фрагменту три строки в правильных кавычках:
В среду добавляются некоторые переменные:
COMP_LINE
содержит полную строку, в которой выполняется завершение. COMP_POINT
содержит позицию курсора внутри COMP_LINE
(считая от 0). COMP_TYPE
равно 9 для нормального завершения, 33 для перечисления альтернатив при неоднозначном завершении, 37 для завершения меню, 63 при переходе между неоднозначными завершениями, 64 для перечисления завершений после частичного завершения. COMP_KEY
содержит ключ, запускающий завершение (например, символ табуляции, если пользователь нажал Tab ). Это примерно тот же механизм, который предоставляется, но лучше документирован , для функций с -F
. Функции получают более разумный интерфейс: они могут читать список слов текущей команды в переменной COMP_WORDS
и начальную позицию текущего слова в COMP_CWORD
; они записывают результаты в массив COMP_REPLY
.
Поскольку полезные аргументы - в частности, префикс для завершения - передаются в конце команды, -C
можно использовать только с внешней командой. Конечно, вы можете использовать что-то вроде sh -c…
, но это будет некрасиво.
complete -C 'sh -c '\'for x in one two three; do case $x in "$1"*) echo "$x";; esac''\'
Попробуйте так,
myFunction()
{
echo "$1"
echo "$2"
}
myFunction 1 2
Похоже, вы хотите разделить первый аргумент, полученный вашей функцией, на пробелы. Для этого вы можете использовать оператор split+glob после настройки разделенной части на использование пробела в качестве разделителя и отключения части glob :
.myfunction() {
local - # make changes to options local to the function.
# needs bash 4.4 or newer.
local IFS=' ' # split on space only
set -o noglob # disable glob part
set -- $1 # split+glob invoked on $1 by leaving that $1 unquoted,
# result stored in $1, $2... using set --
printf '%s\n' "$1"
printf '%s\n' "$2"
}
myfunction "1 2"