Я создаю скрипт завершения bash для инструмента, который разделяет семантику загрузки файлов с curl.
С завитком вы можете сделать:
curl -F переменная=@файл
загрузить файл.
Мое приложение имеет аналогичную семантику, и я хочу иметь возможность отображать возможные файлы после нажатия «@». К сожалению, это оказывается трудным:
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
if [[ "$cur" == @* && "$prev" == '=' ]]; then
COMPREPLY=( $(compgen -f ${cur:1}) )
return 0
fi
Итак, если команда (пока) заканчивается:
abc=@
Будут показаны файлы в текущем каталоге.
var=@/usr/
/usr/bin /usr/games
Проблема в том, что если я действительно нажму вкладку для завершения, «@» исчезнет!
var=/usr/bin
Таким образом, похоже, что bash заменяет все текущее слово на вкладку COMPREPLY.
Единственный способ избежать этого состоял в том, чтобы сделать это:
COMPREPLY=( $(compgen -f ${cur:1}) )
for (( i=0; i<${#COMPREPLY[@]}; i++ ));
do
COMPREPLY[$i]='@'${COMPREPLY[$i]}
done
Но теперь завершение табуляции выглядит, мягко говоря, странно:
@/usr/bin @/usr/games
Есть ли способ показать нормальное завершение табуляции файла (без префикса «@»), но сохранить «@» при нажатии на вкладку?