Я создаю bash завершение script для инструмента, который разделяет загрузку семантики с помощью 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
Итак, если команда (до сих пор) заканчивается:
[email protected]
Отобразятся файлы в текущем каталоге.
[email protected]/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
В любом случае, чтобы показать обычное заполнение вкладки файла (без префикса '@'), но сохраните "@" при нажатии на вкладку?