Автодополнение Bash. Как передать этот массив в compgen без свертывания значительных пробелов?

Следующее завершение 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]}"))
12
задан mtk 26 May 2012 в 21:20
поделиться