Ich habe festgestellt, dass das Setzen der extglob
Shell-Option innerhalb einer zusammengesetzten Verbindung zum Versagen nachfolgender Anti-Globs führt. Müssen Shell-Optionen außerhalb von zusammengesetzten Befehlen festgelegt werden? Ich habe in den Bash-Manpages keinen Hinweis auf eine solche Anforderung gesehen.
Das folgende Skript funktioniert beispielsweise einwandfrei (Drucke a.0 a.1
):
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
shopt -s extglob
ls "a."!(b*)
Wenn die letzten beiden Zeilen jedoch als zusammengesetzter Befehl ausgeführt werden, schlägt das Skript mit dem folgenden Fehler fehl:
syntax error near unexpected token `('
` ls "a."!(b*)'
Dies wurde mit Bash-Versionen von 4.2 bis 4.4 und mit einer Vielzahl von zusammengesetzten Befehlen getestet :
(1) bedingt - if
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
if true; then
shopt -s extglob
ls "a."!(b*)
fi
(2) Zahnspangen - { }
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
{
shopt -s extglob
ls "a."!(b*)
}
(3) Unterschale - ( )
:
#!/bin/bash
touch a.0 a.1 \
a.b.0 a.b.1
(
shopt -s extglob
ls "a."!(b*)
)
In allen Fällen shopt
ist das Skript erfolgreich , wenn der Befehl außerhalb des zusammengesetzten Befehls verschoben wird.
C
oderperl
können es gut. Beachten Sie, dass es nicht ausreicht, nicht Teil eines zusammengesetzten Befehls zu sein, sondern sichshopt -s extglob
auch in einer separaten Zeile befinden muss. Siehe auch die Diskussion und Beispiele hier