Quais são as restrições de escopo para configurar o shopt extglob. e outras opções?

8

Meu shell bash não interativo possui extglob off. Gostaria de ativá-lo na declaração imediatamente antes de um comando, mas notei que, quando shopt -s extglobestá dentro de um if .. then .. elsebloco, ele de alguma forma não é registrado.

A seguir dependentes de extglob comando não é válido: syntax error near unexpected token '('.

Onde pode extglobser definido e por que existe alguma restrição? Isso se aplica a outras opções? ... GNU bash 4.1.5

Isso funciona:

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

Isso falha:

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
fonte

Respostas:

14

Não tenho certeza se existe uma fonte mais autorizada (por exemplo, página de manual / documentação oficial) sobre esse problema, mas encontrei um site que explica esse comportamento: http://mywiki.wooledge.org/glob

Como a opção extglob altera a maneira como certos caracteres são analisados, é necessário ter uma nova linha (não apenas um ponto e vírgula) entre o comando shopt e quaisquer comandos subsequentes que usem globs estendidos. Da mesma forma, você não pode colocar shopt -s extglob dentro de um bloco de instruções que usa globs estendidos, porque o bloco como um todo deve ser analisado quando definido; o comando shopt não entrará em vigor até que o bloco seja avaliado; nesse momento, é tarde demais. De fato, como o bash analisa todo o bloco de instruções antes de avaliar qualquer um deles, é necessário definir extglob fora do bloco mais externo.

lk-
fonte
1
Obrigado. O link wooledge cobre muito bem. Suponho que teve que ser incrementado dessa maneira por causa de alguns problemas herdados.
precisa saber é o seguinte
@ Peter.OI diria que é assim porque o analisador do bash é instável. É claro que sou um usuário zsh de boca suja, exceto que me lembro que esse é o motivo oficial dado na lista de discussão do bash. O Bash tem muitos problemas de análise semelhantes, como alias e=echo; e hellonão funcionar: a definição de alias ocorre apenas na próxima nova linha.
Gilles 'SO- stop being evil' em
Isso é interessante, obrigado ... Um dia, eu vou me virar ou olhar para o zsh. Parece ter todos os sinos e assobios; muito compactos.
precisa saber é o seguinte