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

  • 1つのパラメータを持つオプション-W、変数の値all_commands
  • 変数の値である非オプションパラメータcur

この--パラメーターはオプションの終わりを示します。値がcurダッシュで始まってもオプションとして解釈されません。これはコマンドラインオプションの解析のための非常に一般的な規則です。

${COMPREPLY[@]:-}奇妙なことです。それを使うパラメータ拡張構造 ${VARIABLE:-TEXT}、これはほとんど意味のない方法でVARIABLEif setとnull以外の値と他の値に拡張されます。TEXTarray の要素を取得しますがCOMPREPLY、配列が空または定義されていない場合、結果は空の文字列です。それから結果は単語に分割され、各単語はグローバルパターンとして解釈されます。。これは、定義されておらず有効な${COMPREPLY[@]}場合を除き、まったく同じです。 underで定義されていないとエラーが発生します。特に、このコマンドは配列に追加されずに削除されることに注意してください。配列に追加するには、正しいコードは次のとおりです。COMPREPLYset -uset -u${COMPREPLY[@]}COMPREPLYCOMPREPLY

COMPREPLY+=($(compgen -W "${all_commands}" -- "${cur}") )

想定される出力には、compgenスペースで区切られたglobパターンのリストが含まれています。

おすすめ記事