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

5

Meu shell bash não interativo possui extglob off . Eu gostaria de ativá-lo na declaração imediatamente antes de um comando, mas notei que quando shopt -s extglob está dentro de um bloco if .. then .. else , de alguma forma não registra.

O seguinte comando extglob-dependente não é válido: syntax error near unexpected token '(' .

Onde extglob pode ser definido e por que há 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)' 
    
por Peter.O 21.08.2012 / 05:19

1 resposta

9

Não tenho certeza se há uma fonte mais autorizada (ou seja, página de manual / documentação oficial) sobre esse problema, mas encontrei um site que explica esse comportamento: link

Because the extglob option changes the way certain characters are parsed, it is necessary to have a newline (not just a semicolon) between the shopt command and any subsequent commands that use extended globs. Likewise, you cannot put shopt -s extglob inside a statement block that uses extended globs, because the block as a whole must be parsed when it's defined; the shopt command won't take effect until the block is evaluated, at which point it's too late. In fact as bash parses the entire statement block before evaluating any of it, you need to set extglob outside of the outermost block.

    
por 21.08.2012 / 05:35

Tags