Tmux bash 完成代码演练

Tmux bash 完成代码演练
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},它以一种几乎毫无意义的方式扩展到VARIABLEif 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意味着可选参数的结尾,连字符后面的任何内容都需要被视为位置参数...阅读更多@“--”(双破折号)是什么意思? (也称为“裸双破折号”)

目的:-是从数组内部删除空字符串......

所有问题都解决了..谢谢...

相关内容