Bashで重複完了を回避する方法

Bashで重複完了を回避する方法

デフォルトの完成スクリプトを定義しました。プログラムdの場合は、exempt、limit、show、およびupdateサブコマンドを使用できます。

complete -W "exempt limit show update" d

しかし、後でTabを押すと、d exemptbashは完了メニューを再表示します。

$ d <tab>
exempt  limit   show    update
$ d exempt <tab>
exempt  limit   show    update
$ d exempt exempt <tab>
exempt  limit   show    update

Bashが同じ単語を繰り返し挿入するのを防ぐ方法は?

答え1

あなたが見ているのは、基本的な完成メカニズムを使用するときに予想される動作ですcomplete -W

よりスマートな完成が必要な場合は、完成関数を作成する必要があります(「プログラミング可能な完成」セクションを参照)。バッシュマニュアル)とを使用してくださいcomplete -F

例を調整する方法は次のとおりです。

$ comp_d() {
    COMPREPLY=( $(
        if [ "$COMP_CWORD" -eq 1 ]; then
            compgen -W "exempt limit show update" "$2"
        fi
    ) )
}

$ complete -F comp_d d

これらの関数は完成候補を配列として返す必要がありますCOMPREPLY。ユーザーが最初のパラメータ(1)を完成したCOMP_CWORD場合にのみ単語リストを使用し、そうでなければ配列は空です。

関連情報