Как использовать фигурные скобки в оболочке (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,

Другие вопросы по тегам