Я создаю сценарий завершения bash для инструмента, который разделяет семантику загрузки файлов с curl.
С помощью curl вы можете выполнить:
curl -F var=@file
для загрузки файла.
Мое приложение имеет аналогичную семантику, и я хочу иметь возможность показывать возможные файлы после нажатия '@'. К сожалению, это оказывается трудным.:
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
Проблема в том, что если я действительно нажму Tab для завершения, '@' исчезнет!
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
Можно ли как-то показать нормальное завершение табуляции файла (без префикса '@' )но сохранить '@' при нажатии табуляции?