Как запретить завершение bash заменять символ при завершении табуляции

Я создаю сценарий завершения 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

Можно ли как-то показать нормальное завершение табуляции файла (без префикса '@' )но сохранить '@' при нажатии табуляции?

16
задан UsAaR33 8 May 2012 в 06:16
поделиться