if [[ $COMP_CWORD -le $cmd_index ]]; then
# The user has not specified a command yet
local all_commands="$(tmux -q list-commands | cut -f 1 -d ' ')"
COMPREPLY=( ${COMPREPLY[@]:-} $(compgen -W "${all_commands}" -- "${cur}") )
我试图理解上面 tmux bash 的代码片段自动完成
compgen 的 W 参数采用单词列表。但为什么它对--
当前单词采取额外的选项${cur}
作为参数呢?
:-
花括号里面是什么意思?${COMPREPLY[@]:-}
当我这样做时,tmux<tab>
显示的完成列表与 相同$(tmux -q list-commands | cut -f 1 -d ' ')
。那么,为什么我们需要${COMPREPLY[@]:-}
在数组开头呢?
答案1
compgen -W "${all_commands}" -- "${cur}"
运行compgen
,传递它:
- 带有一个参数的选项
-W
,即变量的值all_commands
; - 一个非选项参数,即变量 的值
cur
。
该--
参数标志着选项的结束。即使 的值cur
以破折号开头,也不会被解释为选项。这是命令行选项解析的极其常见的约定。
${COMPREPLY[@]:-}
是一个奇怪的。它使用参数扩展构造 ${VARIABLE:-TEXT}
,它以一种几乎毫无意义的方式扩展到VARIABLE
if set 且非空的值以及其他值。TEXT
它获取 array 的元素COMPREPLY
,但如果数组为空或未定义,则结果为空字符串。然后结果被分成单词,每个单词被解释为一个全局模式。这完全等同于${COMPREPLY[@]}
except 当COMPREPLY
未定义且set -u
有效时:在 下set -u
,如果未定义,${COMPREPLY[@]}
将触发错误。COMPREPLY
请特别注意,该指令不会附加到COMPREPLY
数组,而是会破坏数组。要附加到数组,正确的代码是
COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )
假设 的输出compgen
包含以空格分隔的 glob 模式列表。
答案2
Double hyphen
意味着可选参数的结尾,连字符后面的任何内容都需要被视为位置参数...阅读更多@“--”(双破折号)是什么意思? (也称为“裸双破折号”)。
目的:-
是从数组内部删除空字符串......
所有问题都解决了..谢谢...