回答:
この2つはまったく異なります。
a[bc]d
あるファイル名のパターン(以外のシェルではfish
)。それは2つのに拡大するファイル名 abd
とacd
、それらの場合は、現在のディレクトリ内の既存のファイルの名前があります。
この[...]
部分は、リストされた文字(または範囲が含まれる場合は照合要素)のうちの1文字に一致する括弧で囲まれた式です。パターンに一致するにはa[bc]d
、文字列間の文字a
とd
、ファイル名には、いずれかでなければなりませんb
かc
。
abd
存在するが、存在acd
しない場合は、のみに展開されabd
、その逆も同様です。
どちらの場合はabd
、もacd
存在するが、シェルおよびオプションに応じて、それはエラー(オリジナルのUnixの引き金となりsh
、(t)csh
、zsh
、fish
、bash -O failglob
)およびおそらくシェルを終了、またはパターンunexpanded¹を残す(ボーン様およびrc
様シェル)以上に拡大何もありません(bash/zsh/yash -o nullglob
、fish
元のUnixの一部の古いバージョン、sh
および(t)csh
同じコマンドに他の一致するグロブがある場合)。
a{b,c}d
あるブレース展開(これらをサポートするシェルで)。2つの文字列 abd
とに展開されますacd
。
{...}
(;いくつかのシェルで、それはまた、などの範囲であってもよい。この例の一部は、文字列のカンマ区切りのセットであるa..k
か、20..25
など、またはより高度なもの00..20..2
又は0..20..2%02d
)、および拡張がフランキングしてこれらの文字列のそれぞれを組み合わせることによって計算されます。文字列a
とd
。これらの文字列は、単一の文字よりも長くなる可能性があり、ブレース展開自体になる可能性もあります。
これらの文字列が既存のファイル名に対応しているかどうかに関係なく、展開が行われます。
文字列を作成する場合は、中括弧を使用します。ファイル名を一致させる場合は、ファイル名パターンを使用します。
¹この特定のケースでa[bc]d
は、たまたま既存のファイルの名前である可能性があるためrm -f ./*.[ch]
、これらのシェルのようなものを使用することは潜在的に危険rm -f ./*.{c,h}
であり、それほど問題ではありません。
a{b,c}d
、b
とc
部品の単一文字である必要はありません。例えばex{ten,ci}sion
。while ex[tenci]sion
または何でもこれらの文字の1つにのみ一致します。
a[bc]d
あるパターンマッチング、およびPOSIX標準の一部です。POSIXでは、これは「パターンブラケット式」として導入されています。マニュアルのセクション2.13に記載されています。
引用符で囲まず、ブラケット式の外側にある場合、次の3文字はパターンの仕様で特別な意味を持ちます。
?
疑問符は、任意の文字に一致するパターンです。
*アスタリスクは、複数の文字と一致するパターンで説明されているように、複数の文字と一致するパターンです。
[オープンブラケットは、パターンブラケット式を導入します。
セクション2.13.3では、ファイル名の展開に使用される場合に通常の正規表現に期待される動作とは異なる動作についても言及しています(私による強調)。
「単一文字に一致するパターン」および「複数文字に一致するパターン」でこれまでに説明した規則は、ファイル名の展開にパターン一致表記法を使用する場合に適用される次の規則によって修飾されます。
パス名のスラッシュ文字は、パターンで1つ以上のスラッシュを使用して明示的に一致します。アスタリスクや疑問符の特殊文字、または括弧式とは一致しません。パターン内のスラッシュは、括弧表現の前に識別されなければなりません。したがって、ファイル名の展開に使用されるパターンブラケット式にスラッシュを含めることはできません。対応する閉じ角かっこが見つかる前に、エスケープされていない開き角かっこに続いてスラッシュ文字が見つかった場合、開き角かっこは通常の文字として扱われます。例えば、パターンは、
"a[b/c]d"
このようなパス名と一致しないabd
か、をa/d
。文字通りのパス名にのみ一致しa[b/c]d
ます。
a{b,c}d
は中括弧の展開であり、POSIXの仕様には含まれていません。bash マニュアルの対応する部分を次に示します(私による強調)。
ブレース展開は、任意の文字列を生成するメカニズムです。このメカニズムはファイル名の展開に似ていますが(ファイル名の展開を参照)、生成されるファイル名は存在する必要はありません。中括弧で展開されるパターンは、オプションのプリアンブルの形式を取り、 一連のコンマ区切り文字列または中括弧のペア間のシーケンス式の後にオプションのポストスクリプトが続きます 。プリアンブルは中括弧内に含まれる各文字列の前に付けられ、その後、結果の各文字列にポストスクリプトが追加され、左から右に拡張されます。
@mosvyのコメントによると、これは最初に表示されましたcsh
が、動作bash
はcsh
他のシェルとは異なります。このタイプのブレース拡張もにありglob(3)
ます。
3.0の{a..z}
後にのみ現れた別のタイプの中括弧の拡張bash
があり、bash
4.0でさらに追加されます。
グロビングがオンになっているシェルで、空のフォルダーで実行すると、次の結果が返されます
$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd
@Jesse_bのコメントへの応答として、対話型シェルを使用していて、その両方が当てはまる場合、a[bc]d
入力の手間が減ります。たとえばgrep pattern [ab][12].txt
。
csh
はずっと前に初めて登場しましたbash
。また、glob(3)ライブラリ関数にも存在します。違いは、bash
他の展開の前に実行されることa=A; ab=A/B; ac=A/C; echo $a{b,c}
です。他のシェルとは異なる方法でbashで動作します。
command a[bc]d
か?