Quelles sont les restrictions de portée pour la définition de shopt extglob. et d'autres options?

8

Mon shell bash non interactif a extglob off. Je voudrais l'activer dans la déclaration immédiatement avant une commande, mais j'ai remarqué que lorsqu'il shopt -s extglobest dans un if .. then .. elsebloc, il ne s'enregistre pas.

Ce qui suit dépend extglob- commande n'est pas valide: syntax error near unexpected token '('.

Où peut- extglobon le définir et pourquoi y a-t-il une restriction? Cela s'applique-t-il à d'autres options? ... GNU bash 4.1.5

Cela marche:

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

Cela échoue:

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
la source

Réponses:

14

Je ne sais pas s'il existe une source plus fiable (c'est-à-dire une page de manuel / une documentation officielle) sur ce problème, mais j'ai trouvé un site qui explique ce comportement: http://mywiki.wooledge.org/glob

Étant donné que l'option extglob change la façon dont certains caractères sont analysés, il est nécessaire d'avoir une nouvelle ligne (pas seulement un point-virgule) entre la commande shopt et toutes les commandes suivantes qui utilisent des globs étendus. De même, vous ne pouvez pas placer shopt -s extglob dans un bloc d'instructions qui utilise des globs étendus, car le bloc dans son ensemble doit être analysé lorsqu'il est défini; la commande shopt ne prend effet que lorsque le bloc est évalué, moment auquel il est trop tard. En fait, lorsque bash analyse l'intégralité du bloc d'instructions avant d'en évaluer une, vous devez définir extglob en dehors du bloc le plus à l'extérieur.

lk-
la source
1
Merci. Le maillon en laine couvre assez bien. Je suppose qu'il a dû être implémenté de cette façon en raison de certains problèmes hérités.
Peter.O
@ Peter.OI dirais que c'est comme ça parce que l'analyseur de bash est bancal. Bien sûr, je suis un utilisateur zsh sale, sauf que je me souviens que c'est la raison officielle donnée sur la liste de diffusion bash. Bash a beaucoup de problèmes d'analyse similaires, comme le fait de alias e=echo; e hellone pas fonctionner: la définition d'alias n'a lieu que sur la nouvelle ligne suivante.
Gilles 'SO- arrête d'être méchant'
C'est intéressant, merci ... Un jour, je me déplacerai en regardant zsh. Il semble avoir toutes les cloches et tous les sifflets; très compacts.
Peter.O