我正在为一个与 curl 共享文件上传语义的工具构建一个 bash 完成脚本。
使用 curl,您可以执行以下操作:
curl -F var=@文件
上传文件。
我的应用程序具有类似的语义,我希望能够在按下“@”后显示可能的文件。不幸的是,事实证明这很困难:
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
无论如何显示正常的文件选项卡完成(没有'@'前缀)但在点击选项卡时保留'@'?