![ls [13]とls {1,3}の違いは何ですか?](https://rvso.com/image/885982/ls%20%5B13%5D%E3%81%A8ls%20%7B1%2C3%7D%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F.png)
コマンドを使用して、ディレクトリに 3 つのファイルを作成しましたtouch inv{1..3}.txt
。ここで 2 つのコマンドを使用しましたが、その出力はほぼ同じです。その 2 つのコマンドはls inv[13].txt
とですls {1,3}.txt
。
では、これら 2 つはどのように違うのでしょうか? 角括弧は中括弧と比べてどう違うのでしょうか? また、「linux [..]」を Google で検索しましたが、何も見つかりませんでした。Linux 用語ではこれらが何と呼ばれているかを教えていただけますか?
ありがとう
答え1
{}
は中括弧展開と呼ばれます。 と の 2 つの形式があり、{x..y}
とを任意の英数字またはアルファベットの値に{x,y}
置き換えます。x
y
最初の形式では、は
{x..y}
から までのすべての値に展開されます。たとえば、 は、、、に展開されます。x
y
{2..5}
2
3
4
5
2 番目の明示的な形式では、は 、
{x,y}
のみに展開されますx
。y
たとえば、はおよび{2,5}
に展開されます。2
5
展開できない場合、パターンは文字通りに扱われます (例: )
{a..3}
。重要な点は、ファイルの作成/一致中に、ファイルの一致に関係なく、括弧の展開が (可能な場合) 実行されることです。
[]
パス名拡張 (またはグロブ) パターンとして知られています。中括弧拡張とは異なり、ファイル名の一致時にのみ使用でき、ファイルの作成時に使用すると文字通りに扱われます。[xyz...]
と の2 つの形式があります[x-y]
。最初の形式では、角括弧内の任意の 1 文字に個別に一致します。つまり、各文字は個別に扱われます。したがって、は現在のディレクトリ内のまたは という
[25].txt
名前のファイルに一致しますが、 はまたはまたは という名前の任意のファイルに一致します。2.txt
5.txt
[245].txt
2.txt
4.txt
5.txt
2 番目の形式では、範囲の拡張が最初に実行されてから個別に一致が行われます。範囲の拡張が実行できない場合は、文字どおりに扱われます。たとえば、 の場合、またはまたはという
[2-5]. txt
名前のファイルと一致します。範囲を拡張できない場合は、 の場合のように文字どおりに扱われます。2.txt
3.txt
4.txt
5.txt
[a-3].txt
これら 2 つの重要な動作の違いは、一致するパターンが多いのに実際に一致するパターンが少ない場合です。括弧の展開は必ず行われるため、特定のファイルが存在しないというエラーが表示されますが、パス名の展開は残りのファイルに対してはエラーなしで可能な限り一致します。
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
移植性に関する注意:
パス名拡張演算子[]
は POSIX によって定義されているため、Bourne シェルとその派生シェル間で移植可能です。
中括弧展開 は{}
POSIX で定義されていないため、すべてのシェル間で移植可能ではありません。たとえば、 dash
( sh
Ubuntu の) にはこれがありません。これは から借用されたもので、、、csh
などの特定のシェルでのみ機能します。実装する前に、使用しているシェルがこれをサポートしていることを確認してください。bash
zsh
ksh93
fish
例:
$ touch {1..3}.txt
$ ls {1..3}.txt
1.txt 2.txt 3.txt
$ ls {1,2,3}.txt
1.txt 2.txt 3.txt
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt 2.txt 3.txt
$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory
$ ls [123].txt
1.txt 2.txt 3.txt
$ ls [1-3].txt
1.txt 2.txt 3.txt
$ ls [1-4].txt
1.txt 2.txt 3.txt
$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory
答え2
2 つの形式の主な違いを次に示します。
$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt
inv[15].txt
はグロブであり、ファイルシステム上の一致するファイルのリストを展開します。これはパス名の拡張。
inv{1,5}.txt
実際にファイルシステム上にあるファイルに関係なく展開されます。inv1.txt
これはinv5.txt
ブレース拡張。