Я создал три файла в своем каталоге с помощью команды touch inv {1..3} .txt
. Теперь я использовал две команды, и их результат практически не изменился. Эти две команды: ls inv [13] .txt
и ls {1,3} .txt
.
Так чем же эти два разные? Чем квадратные скобки отличаются от фигурных скобок? Также я искал в Google "linux [..]", но ничего не нашел, так могу ли я узнать, как эти вещи называются в терминологии Linux?
Спасибо
{}
назван расширением фигурной скобки. Это имеет две формы: {x..y}
и {x,y}
, замена x
и y
с любым алфавитным или числовым значением.
В первой форме, {x..y}
будет расширен до всех значений от x
кому: y
, включительно. Например, {2..5}
будет расширен до 2
, 3
, 4
, 5
.
Во второй явной форме, {x,y}
будет расширен до только x
, y
. Например, {2,5}
будет расширен до 2
и 5
.
Если никакое расширение не возможно, шаблон рассматривают буквально, например, в {a..3}
.
Важная вещь отметить состоит в том, что расширение фигурной скобки будет сделано (если возможный) независимо от любого соответствия файла, в то время как в создании/соответствии файла.
[]
известен как расширение пути (или globbing) шаблон. В отличие от расширения фигурной скобки можно только использовать его при соответствии именам файлов, это будут рассматривать буквально при использовании его при создании файлов.
Это имеет две формы: [xyz...]
и [x-y]
.
В первой форме это будет соответствовать любому отдельному символу в квадратных скобках отдельно, Т.е. каждый символ рассматривают индивидуально. Таким образом для [25].txt
это будет соответствовать названному файлу 2.txt
или 5.txt
в текущем каталоге, в то время как для [245].txt
это будет соответствовать любому названному файлу 2.txt
или 4.txt
или 5.txt
.
Во второй форме расширение диапазона сделано сначала прежде, чем соответствовать индивидуально, если это возможно, иначе рассматриваемый буквально. Таким образом для [2-5]. txt
, это будет соответствовать любому названному файлу 2.txt
или 3.txt
или 4.txt
или 5.txt
. Если диапазон не может быть расширен, он будет, рассматривал буквально, например, в случае [a-3].txt
.
Важное поведенческое различие между этими двумя - когда существует больше шаблонов для соответствия, в то время как меньше на самом деле подобран. Поскольку расширение фигурной скобки сделано независимо от того, что, оно покажет ошибку, что определенный файл (файлы) не существует, в то время как расширение пути будет соответствовать любому возможному без любой ошибки для остальных:
$ 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
Основное отличие между двумя формами проиллюстрировано здесь:
$ 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
независимо от того, какие файлы находятся на самом деле в Вашей файловой системе. Это - расширение фигурной скобки.