Как разобрать аргументы с пространством внутри функции Bash

Задача команды -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''\'

0
03.10.2018, 17:22
2 ответа

Попробуйте так,

myFunction()
{
        echo "$1"
        echo "$2"
}

myFunction 1 2
1
28.01.2020, 02:14

Похоже, вы хотите разделить первый аргумент, полученный вашей функцией, на пробелы. Для этого вы можете использовать оператор 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"
4
28.01.2020, 02:14

Теги

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