Как использовать фигурные скобки в оболочке (bash)
В настоящее время я пытаюсь воспроизвести базовое поведение оболочки и, в частности, глобальное поведение. Я тестировал команды с фигурными скобками и обнаружил, что такое поведение мне непонятно. Во-первых, содержимое каталога, в котором я работаю, следующее:
1abc 2abc 3abc abc1 abc2 abc3
Затем я набрал следующую команду: ls {[1-3],[a-c]}*
и он вернул мне все файлы выше, как и ожидалось.
И наконец, я попробовал эту команду: ls {{,[1-3]},[a-c]}*
, который, как вы можете видеть, имеет вьющиеся фигурные скобки. Теперь, что я не понимаю, это возвращение этой команды, потому что она дала мне это: 1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3
Как видите, все файлы были возвращены два раза, и я не могу понять, как оболочка интерпретирует это.
Я надеюсь, что мое объяснение было ясно.
2 ответа
Строка {{,[1-3]},[a-c]}*
это выражение, интерпретируемое как расширение скобки, которое состоит из следующих шаблонов:
- "пустота" (
{,
), [1-3]
, а также[a-c]
,
*
символ (означающий "каждое имя файла в данном каталоге") применяется для каждого из них:
* => 1abc 2abc 3abc abc1 abc2 abc3
[1-3]* => 1abc 2abc 3abc
[a-c]* => abc1 abc2 abc3
Тот факт, что вы вложили выражения, не меняет значения того, что это просто список из трех шаблонов. Тот же эффект может быть достигнут с помощью более простого выражения, такого как {,[1-3],[a-c]}*
или другой "список списков", например {,{[1-3],[a-c]}}*
,
Если вы передадите выражение echo
, он будет печатать все символы из строк выше, один за другим:
$ echo {{,[1-3]},[a-c]}*
1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3
Но ls
сортирует записи по алфавиту по умолчанию:
$ ls {{,[1-3]},[a-c]}*
1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3
Баш расширяется
{{,[1-3]},[a-c]}*
на первом этапе (расширение-скобка) для
* [1-3]* [a-c]*
На втором этапе (сглаживание) bash расширяется *
ко всем файлам и [1-3]*
ко всем файлам, начинающимся с 1
,2
или же 3
и расширяется [a-c]*
ко всем файлам, начинающимся с a
, b
или же c
,