Каковы ограничения по объему установки Shog Extglob. а другие варианты?

8

Моя неинтерактивная оболочка bash имеет extglob off. Я хотел бы включить его в операторе непосредственно перед командой, но я заметил, что когда он shopt -s extglobнаходится внутри if .. then .. elseблока, он как-то не регистрируется.

Следующий extglob-зависимая команда недопустима: syntax error near unexpected token '('.

Где можно extglobустановить и почему вообще есть ограничение? Это относится к другим вариантам? ... GNU bash 4.1.5

Это работает:

shopt -s extglob
if true ;then
    touch a.bcd; ls a.@(bcd)
fi

Это не удается:

if true ;then
    shopt -s extglob
    touch a.bcd; ls a.@(bcd)
fi
... line 17: syntax error near unexpected token `('
... line 17: `touch a.bcd; ls a.@(bcd)' 
Peter.O
источник

Ответы:

14

Не уверен, что существует более авторитетный источник (например, справочная страница / официальная документация) по этой проблеме, но я нашел сайт, который объясняет это поведение: http://mywiki.wooledge.org/glob

Поскольку параметр extglob изменяет способ анализа определенных символов, необходимо установить новую строку (не просто точку с запятой) между командой shopt и любыми последующими командами, использующими расширенные глобусы. Аналогично, вы не можете поместить shopt -s extglob в блок оператора, который использует расширенные глобусы, потому что блок в целом должен быть проанализирован, когда он определен; команда shopt не вступит в силу, пока блок не будет оценен, в этот момент уже слишком поздно. Фактически, поскольку bash анализирует весь блок операторов перед его оценкой, вам нужно установить extglob вне самого внешнего блока.

lk-
источник
1
Спасибо. Wooledge ссылка охватывает его довольно хорошо. Я полагаю, что так должно было произойти из-за некоторых унаследованных проблем.
Peter.O
@ Peter. Я бы сказал, что это так, потому что парсер bash ненадежен. Конечно, я грязный пользователь zsh, но я помню, что это официальная причина, приведенная в списке рассылки bash. Bash имеет много похожих проблем, например, alias e=echo; e helloне работает: определение псевдонима происходит только на следующей новой строке.
Жиль "ТАК - перестань быть злым"
Это интересно, спасибо ... Однажды я обойду или не посмотрю на Zsh. Кажется, есть все навороты; очень компактные.
Peter.O