当可能的选项可能包含空格时,bash补全出现问题。
假设我想要一个回显第一个参数的函数:
function test1() {
echo $1
}
我生成了一个可能的完成选项列表(有些有空格,有些没有空格),但是我无法正确处理空格。
function pink() {
# my real-world example generates a similar string using awk and other commands
echo "nick\ mason syd-barrett david_gilmour roger\ waters richard\ wright"
}
function _test() {
cur=${COMP_WORDS[COMP_CWORD]}
use=`pink`
COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o filenames -F _test test
当我尝试这个时,我得到:
$ test <tab><tab>
david_gilmour nick roger waters
mason richard syd-barrett wright
$ test r<tab><tab>
richard roger waters wright
这显然不是我的意思。
如果我没有将数组分配给COMPREPLY
,即仅分配给,$( compgen -W "$use" -- $cur )
则只有一个选项可以使它工作:
$ test n<tab>
$ test nick\ mason <cursor>
但是,如果还有几个选项,它们都将用单引号引起来:
$ test r<tab><tab>
$ test 'roger waters
richard wright' <cursor>
我的COMPREPLY
变量一定有问题,但是我不知道是什么...
(在solaris上运行bash,以防发生变化……)
如果您需要处理字符串中的数据,则可以使用Bash内置的字符串替换运算符。
function _test() {
local iter use cur
cur=${COMP_WORDS[COMP_CWORD]}
use="nick\ mason syd-barrett david_gilmour roger\ waters richard\ wright"
# swap out escaped spaces temporarily
use="${use//\\ /___}"
# split on all spaces
for iter in $use; do
# only reply with completions
if [[ $iter =~ ^$cur ]]; then
# swap back our escaped spaces
COMPREPLY+=( "${iter//___/ }" )
fi
done
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句