Я обнаружил, что установка параметра extglob
оболочки в составном соединении приводит к отказу последующих антиглобов. Должны ли параметры оболочки быть установлены вне составных команд? Я не видел указаний на такое требование в справочных страницах bash.
Как пример, следующий скрипт работает нормально (печатает a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Однако, если последние две строки выполняются как составная команда, сценарий завершается ошибкой со следующей ошибкой:
syntax error near unexpected token `('
` ls "a."!(b*)'
Это было протестировано с использованием версий bash от 4.2 до 4.4 и с помощью различных составных команд :
(1) условно - if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2) брекеты - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) подоболочка - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
Во всех случаях, если команда shopt
перемещается за пределы составной команды, сценарий завершается успешно.
C
илиperl
могут делать это хорошо. Обратите внимание, что не быть частью составной команды недостаточно,shopt -s extglob
также должно быть в отдельной строке. Смотрите также обсуждение и примеры здесь