ファイルアップロードのセマンティクスをcurlと共有するツール用のbash完了スクリプトを作成しています。
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
問題は、実際にタブを押して完了すると、「@」が消えてしまうことです!
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
通常のファイル タブ補完 (「@」プレフィックスなし) を表示する方法はありますが、タブを押すときに「@」を保持しますか?