是否有一种方法可以对文件路径进行bash补全(如ls程序),但仅适用于某个参数?我一直对文档感到困惑:https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html#Programmable-Completion-Builtins
我想使用-F
选项设置我自己的功能,但是我只希望程序的一个子命令的文件路径完成。
请注意,使用compgen -f
可以很容易地完成操作,但是这会返回完整路径的列表,例如:
# compgen -f /bin/
/bin/[
/bin/bash
/bin/cat
/bin/chmod
/bin/cp
/bin/csh
<snip>
但是ls这样完成:
# ls /bin/
[* cat* cp* date* df* ed*
hostname* ksh* link* ls* mv* ps*
<snip>
我相信只有一个COMPREPLY
列表是从完成例程发送回bash的,似乎没有办法区分完整的程序参数和bash显示的部分参数。除非有一些技巧,否则我可以使用。
不幸的是,完整路径字符串很快就会变得难以处理,特别是对于目录中包含大量文件的大型编程项目。
答案 0 :(得分:1)
赞:
foo_completion.sh
_complete_foo_ () {
# Current word
local word=${COMP_WORDS[$COMP_CWORD]}
# Previous word
local pword=${COMP_WORDS[$((COMP_CWORD-1))]}
if [ ${COMP_CWORD} -eq 1 ] ; then
# The sub commands bar and baz are available
COMPREPLY=( $(compgen -W "bar baz" -- "${word}" ))
elif [ "${pword}" = "bar" ] ; then
# (Only) For bar we do default filename completion (like ls)
compopt -o default
elif [ "${pword}" = "baz" ] ; then
# For baz we do something else
COMPREPLY=( $(compgen -W "something else" -- "${word}" ))
fi
return 0
}
complete -F _complete_foo_ foo
现在获取文件:
source foo_completion.sh
...并尝试完成
foo <tab><tab> # bar baz
foo bar <tab><tab> # file and dir name completion like ls
foo baz <tab><tab> # something else