Bashのネストされた中括弧拡張の謎

Bashのネストされた中括弧拡張の謎

これ:

$ echo {{a..c},{1..3}}

次を生成します。

a b c 1 2 3

いいですが、説明するのは難しいです。

$ echo {a..c},{1..3}

与えられた

a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3

これはどこかに文書化されていますか?これバッシュリファレンスこれに対する言及はありません(たとえそれを使用する例がありますが)。

ベストアンサー1

さて、一度に一層ずつ解いてみましょう。

X{{a..c},{1..3}}Y

X{a..c}Y X{1..3}Yは(存在を通じて)に拡張されるものとして記録されX{A,B}Y、それ自体は に拡張されるものとして記録されます。XA XBA{a..c}B{1..3}XaY XbY XcY X1Y X2Y X3Y

入れ子にできることを文書化する価値があります(最初の項目は入れ子になっ}ていません)。閉鎖{例えば、最初のもの)。

私はシェルがこの問題を解決するために選択できると思います。内部にまず、中括弧は各端で順番に次のように動作します}

  1. X{{a..c},{1..3}}
  2. X{a,{1..3}}Y X{b,{1..3}}Y X{c,{1..3}}Y

    (つまり、、where isとisA{a..c}Bに拡張されます)AaB AbB AcBAX{B,{1..3}Y

  3. X{a,1}Y X{a,2}Y X{a,3}Y X{b,1}Y X{b,2}Y X{b,3}Y X{c,1}Y X{c,2}Y X{c,3}Y

  4. XaY X1Y XaY Xa2...

cshしかし、私はこれが特により直感的であるか役に立つとは思いません(たとえば、コメントのKevinの例を参照してください)。拡張が実行される順序についてはまだあいまいさがあります。 70年代の拡張と比較して、後で{1..3}(1995)で形が作られましzsh{a..c}が、その後(2004)でbash)が作られました。

参考にしてくださいcsh(最初から2BSD(1979) マニュアルページ)は中括弧拡張が入れ子になる可能性があるという事実を文書化しますが、入れ子になった中括弧拡張がどのように拡張されるかを明示的に指定しません。しかし、あなたはできます。csh1979年のコードを見てくださいそれがどのように行われたか見てください。ネストを明示的に処理する方法と、外部中括弧から始めて解析する方法を確認してください。

{a..c},{1..3}とにかく拡張の影響が何であるかよくわかりません。ここで、,演算子は中括弧で拡張されていないため(中括弧内にないため)、通常の文字として扱われます。

おすすめ記事