Bash: `-su: $ *: ungebundene Variable` mit` set -u`

8

Dies ist ein FreeBSD 7.x-System, auf dem GNU Bash Version 4.0 ausgeführt wird.

In Bash kann die set -uOption eine Shell zwingen, einen Fehler zu drucken, wenn sie auf eine nicht gesetzte Variable stößt, wie folgt:

$ set -u
$ echo $THISISUNSET
-su: THISISUNSET: unbound variable
$ echo $?
1

Es tritt jedoch auch der gleiche Fehler für $ * auf:

$ echo $*
-su: $*: unbound variable
$ echo $?
1
$ echo $@
-su: $@: unbound variable

Das Bash-Handbuch 4.3.1 Das Set Builtin besagt ausdrücklich, dass set -u$ * und $ @ ignoriert werden:

-u Behandelt nicht gesetzte Variablen und Parameter außer den speziellen Parametern '@' oder '*' als Fehler bei der Parametererweiterung. Eine Fehlermeldung wird in den Standardfehler geschrieben und eine nicht interaktive Shell wird beendet.

Wie kann ich das beheben?

Stefan Lasiewski
quelle

Antworten:

11

Dies ist ein Fehler in älteren Versionen von Bash, insbesondere 4.0 β2 Patchlevel d bis 4.0 Patchlevel m. Aus dem Änderungsprotokoll von 4,0 bis 4,1 α:

n. Das Verhalten set -u, der neuesten Posix-Interpretation zu entsprechen, wurde behoben: Jede Erweiterung einer nicht gesetzten Variablen mit Ausnahme von $ @ und $ * führt zum Beenden der Shell.

Dieses Verhalten wurde in 4.0β2 eingeführt, da das vorherige (und jetzt wieder aktuelle) Verhalten als fehlerhaft angesehen wurde:

d. Es wurde ein Fehler behoben, der dazu führte, dass Erweiterungen von $ @ und $ * die Shell nicht verließen, wenn die Option -u aktiviert war und keine Positionsparameter vorhanden waren.

Gilles 'SO - hör auf böse zu sein'
quelle