В дополнение к базовым шаблонам *
, ?
и [...]
оболочка Bash предоставляет расширенные операторы сопоставления с образцом, такие как !(pattern-list)
(«сопоставлять все, кроме одного из заданных шаблонов»). Для их использования необходимо установить параметр оболочки extglob
. Пример:
~$ mkdir test ; cd test ; touch file1 file2 file3
~/test$ echo *
file1 file2 file3
~/test$ shopt -s extglob # make sure extglob is set
~/test$ echo !(file2)
file1 file3
Если я передаю выражение оболочки программе, которая выполняет его в под-оболочке, оператор вызывает ошибку. Вот тест, который запускает вложенную оболочку напрямую (здесь я выполняю из другого каталога, чтобы убедиться, что расширение не произойдет преждевременно):
~/test$ cd ..
~$ bash -c "cd test ; echo *"
file1 file2 file3
~$ bash -c "cd test ; echo !(file2)" # expected output: file1 file3
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'
Я пробовал все виды побега, но ничего из того, что я придумал, не сработало правильно. Я также подозревал, что extglob
не установлен в под-оболочке, но это не так:
~$ bash -c "shopt -s extglob ; cd test ; echo !(file2)"
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd test ; echo !(file2)'
Любое решение приветствуется!