Was sind die Bereichsbeschränkungen für die Einstellung von shopt extglob? und andere Möglichkeiten?

8

Meine nicht interaktive Bash-Shell hat extglob off. Ich möchte es in der Anweisung unmittelbar vor einem Befehl aktivieren, aber ich habe festgestellt, dass shopt -s extglobes sich innerhalb eines if .. then .. elseBlocks irgendwie nicht registriert.

Der folgende extglob-abhängige Befehl ist ungültig : syntax error near unexpected token '('.

Wo kann extglobeingestellt werden und warum gibt es überhaupt eine Einschränkung? Gilt dies für andere Optionen? ... GNU Bash 4.1.5

Das funktioniert:

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

Dies schlägt fehl:

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
quelle

Antworten:

14

Nicht sicher , ob es eine maßgebliche Quelle (dh Manpage / offizielle Dokumentation.) Zu diesem Thema, aber ich fand eine Website , die dieses Verhalten erklärt: http://mywiki.wooledge.org/glob

Da die Option extglob die Art und Weise ändert, in der bestimmte Zeichen analysiert werden, muss zwischen dem Befehl shopt und allen nachfolgenden Befehlen, die erweiterte Globs verwenden, eine neue Zeile (nicht nur ein Semikolon) stehen. Ebenso können Sie shopt -s extglob nicht in einen Anweisungsblock einfügen, der erweiterte Globs verwendet, da der Block als Ganzes analysiert werden muss, wenn er definiert ist. Der Befehl shopt wird erst wirksam, wenn der Block ausgewertet wird. Zu diesem Zeitpunkt ist es zu spät. Da bash den gesamten Anweisungsblock analysiert, bevor einer davon ausgewertet wird, müssen Sie extglob außerhalb des äußersten Blocks setzen.

lk-
quelle
1
Vielen Dank. Das Wooledge- Glied deckt es recht gut ab. Ich nehme an, dass es aufgrund einiger älterer Probleme auf diese Weise umgesetzt werden musste.
Peter.O
@ Peter.OIch würde sagen, dass es so ist, weil Bashs Parser wackelig ist. Natürlich bin ich ein zsh-Benutzer mit schmutzigem Mund, außer dass ich mich anscheinend daran erinnere, dass dies der offizielle Grund ist, der auf der Bash-Mailingliste angegeben ist. Bash hat viele ähnliche Analyseprobleme, z. B. alias e=echo; e hellofunktioniert es nicht: Die Aliasdefinition findet nur in der nächsten Zeile statt.
Gilles 'SO - hör auf böse zu sein'
Das ist interessant, danke ... Eines Tages werde ich zsh ansehen. Es scheint alle Schnickschnack zu haben; sehr kompakte.
Peter.O