有 cur、prev、split、words 和 cword 等变量。它们似乎具有我可以在完成功能中使用的价值。它们在哪里定义和分配?它们出口到某个地方吗?我应该在完成中将这些变量声明为具有相同名称的本地变量吗?
答案1
如果您使用预定义函数_init_completion
(其声明可以像这)在我的完成函数中,您应该将某些变量声明为局部变量。
引用上面的声明_init_completion
:
# Initialize completion and deal with various general things: do file
# and variable completion where appropriate, and adjust prev, words,
# and cword as if no redirections exist so that completions do not
# need to deal with them. Before calling this function, make sure
# cur, prev, words, and cword are local, ditto split if you use -s.
也许最好声明words
为本地数组,因为它被用作数组。如果您使用其他此类函数,您可能需要声明一些其他变量;我认为最好检查一下代码是否需要什么。
在 Bash 中测试变量作用域:
如果我local
在函数中使用a
(
x=1
(
unset -v x
b() { echo $x; x=b; }
a() { local x=a; b; echo $x; }
a
if [[ ${x+x} ]]; then
echo $x
else
echo 'x is unset'
fi
)
echo $x
)
输出是
a
b
x is unset
1
但如果我不在local
函数中使用a
(
x=1
(
unset -v x
b() { echo $x; x=b; }
a() { x=a; b; echo $x; }
a
if [[ ${x+x} ]]; then
echo $x
else
echo 'x is unset'
fi
)
echo $x
)
输出是
a
b
b
1
即该值可供 的调用者使用a
。