Следующее завершение bash передает массив возможных слов (например, завершений) для compgen.
basenames=("foo" "fu bar" "baz");
COMPREPLY=($(compgen -W "${basenames[*]}" -- "${COMP_WORDS[COMP_CWORD]}"))
Проблема заключается в том, что пробелы в элементах массива не сохраняются, то есть "foo bar" рассматривается как элемент благодаря разбиению слов. Есть ли способ сохранить пробелы, так что отображаются 3 элемента, а не 4?
ИЗМЕНИТЬ
basenames
содержит имена файлов, то есть почти каждый символ (кроме/и\0) разрешен.
РЕДАКТИРОВАТЬ 2
Флаг -W ожидает одно слово, что-то вроде foo bar foobar
. Передача ему нескольких элементов (это то, что будет делать ${basenames[@]}
) не будет работать.
РЕДАКТИРОВАТЬ 3
Изменен массив базовых имен (так что foo
и foo
from foo bar
не будут свернуты).
Использование новой строки для разделения слов работает:
local IFS=$'\n'
COMPREPLY=($(compgen -W "$(printf "%s\n" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))
Использование \0
не выполняет:
local IFS=$'\0'
COMPREPLY=($(compgen -W "$(printf "%s\0" "${basenames[@]}")" -- ${COMP_WORDS[COMP_CWORD]}"))