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
:
- 1つのパラメータを持つオプション
-W
、変数の値all_commands
。 - 変数の値である非オプションパラメータ
cur
。
この--
パラメーターはオプションの終わりを示します。値がcur
ダッシュで始まってもオプションとして解釈されません。これはコマンドラインオプションの解析のための非常に一般的な規則です。
${COMPREPLY[@]:-}
奇妙なことです。それを使うパラメータ拡張構造 ${VARIABLE:-TEXT}
、これはほとんど意味のない方法でVARIABLE
if setとnull以外の値と他の値に拡張されます。TEXT
array の要素を取得しますがCOMPREPLY
、配列が空または定義されていない場合、結果は空の文字列です。それから結果は単語に分割され、各単語はグローバルパターンとして解釈されます。。これは、定義されておらず有効な${COMPREPLY[@]}
場合を除き、まったく同じです。 underで定義されていないとエラーが発生します。特に、このコマンドは配列に追加されずに削除されることに注意してください。配列に追加するには、正しいコードは次のとおりです。COMPREPLY
set -u
set -u
${COMPREPLY[@]}
COMPREPLY
COMPREPLY
COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )
想定される出力には、compgen
スペースで区切られたglobパターンのリストが含まれています。
答え2
Double hyphen
オプションのパラメータの終わりを意味します。ハイフンの後のすべての項目は位置パラメータとして扱われるべきです。続きを読む"--"(二重ダッシュ) とはどういう意味ですか? (「ネイキッドダブルダッシュ」とも呼ばれる)。
目的は、:-
配列内から空の文字列を削除することです。
すべての問題が解決されました..ありがとう。