假设我有一个名为“foo”的命令,它接受一个参数(“加密”或“解密”),然后是一个文件列表。我想编写一个 bash 完成脚本来帮助处理第一个参数,然后为其他参数启用标准文件完成。我能得出的最接近的结果是:
complete -F _foo foo
function _foo()
{
local cmds cur
if [ $COMP_CWORD -eq 1 ]
then
cur="${COMP_WORDS[1]}"
cmds=("encrypt decrypt")
COMPREPLY=($(compgen -W "${cmds}" -- ${cur}) )
else
COMPREPLY=($(compgen -f ${COMP_WORDS[${COMP_CWORD}]} ) )
fi
}
这会正确执行第一个参数,并会从当前目录中为后续参数选择一个文件名。但是假设当前目录包含一个包含文件 baz.txt 的子目录 bar。键入 ba-TAB-TAB 后,完成结果为“bar”(“r”后的空格)并准备好选择下一个参数。我想要的是标准的 bash 完成,结果是“bar/”(斜杠后没有空格),准备在子目录中选择一个文件。有什么办法可以得到吗?
最佳答案
我知道这有点晚了,但我在这里找到了解决方案:https://stackoverflow.com/a/19062943/108105
基本上,您使用 complete -o bashdefault -o default
,当您想恢复为默认的 bash 完成时,您可以设置 COMPREPLY=()
。这是一个例子:
complete -o bashdefault -o default -F _foo foo
_foo() {
local cur=${COMP_WORDS[COMP_CWORD]}
if (( $COMP_CWORD == 1 )); then
COMPREPLY=( $(compgen -W 'encrypt decrypt' -- "$cur") )
else
COMPREPLY=()
fi
}
关于bash - 如何在 bash 中启用默认文件完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513571/