Следующее завершение 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
из 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]}"))