2

次のコードが bash 補完スクリプトで何をするのか理解できません。

    case "$last" in
    +\(--import|-i\))
            _filedir '+(txt|html)';;

そのケースはいつ会ったのですか?上記の2行目は次のようになると思いました

--import|-i)

これは私には理にかなっています。bash_completion.dディレクトリをgrepしまし'+\\('たが、それが唯一のものだったので、それほど一般的ではないと思います。

4

1 に答える 1

3

このコードは、文脈がなければ実に不可解です。そのままでは、2 つのリテラル文字列に一致します -

$ case "+(--import" in +\(--import|-i\)) echo match ;; esac
match
$ case "-i)" in +\(--import|-i\)) echo match ;; esac
match

拡張された glob pattern に似ています+(--import|-i)が、この形式では、リテラル パターン (パイプをエスケープする必要があります) にも実際のパターン (括弧をエスケープ解除する必要があります) にも一致しません。私は「バグ」だと思いますが、bash の補完はクレイジーなメタプログラミングの地雷原であるため、スクリプト全体を見ずに言うことはできません。

bash(1)から

shopt ビルトインを使用して extglob シェル オプションを有効にすると、いくつかの拡張パターン マッチング演算子が認識されます。以下の説明では、pattern-list は | で区切られた 1 つ以上のパターンのリストです。複合パターンは、次のサブパターンの 1 つまたは複数を使用して形成できます。

[...]

          +(pattern-list)
                 Matches one or more occurrences of the given patterns
于 2012-09-19T05:58:06.357 に答える