我正在尝试设置 bash 补全,但有两个问题
- 对于参数一,我需要完成目录
- 对于参数二,一个用于完成的固定数组,我只是不知道如何让 bash 进行选择,之前我总是使用 perl 脚本来处理复杂的脚本。
_some_func()
{
case $COMP_CWORD in
1)
# default completion ? how
;;
2)
COMPREPLY=( "go" "unbind" )
# I should be using a program to echo "go" and "unbind",
# and let bash decide which one to complete , right ?
# that's the only two possible parameters here
;;
esac
}
complete -F _some_func some_func
答案1
这是一种方法:设置dirnames
为默认完成,并为第二个参数生成自定义完成。
_some_func () {
case $COMP_CWORD in
1) :;; # let the default take over
2) COMPREPLY=($(compgen -W "go unbind" "${COMP_WORDS[$COMP_CWORD]}"));;
*) COMPREPLY=("");;
esac
}
complete -F _some_func -d some_func
您也可以调用compgen -d
when $COMP_CWORD
is 1,但这在 bash 中效果不佳,因为您需要转义 输出中的空格compgen
,并且您无法区分分隔两个结果的换行符和完成中包含的换行符(罕见,但有可能)。