Bash: `-su: $ *: variable non liée` avec` set -u`

8

Il s'agit d'un système FreeBSD 7.x exécutant GNU bash version 4.0.

Dans Bash, l' set -uoption peut forcer un shell à afficher une erreur s'il rencontre une variable non définie, comme ceci:

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

Cependant, je rencontre également cette même erreur pour $ *:

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

Le manuel de Bash 4.3.1 Le Set Builtin dit spécifiquement qu'il set -uignore $ * et $ @:

-u Traite les variables et paramètres non définis autres que les paramètres spéciaux '@' ou '*' comme une erreur lors de l'expansion des paramètres. Un message d'erreur sera écrit dans l'erreur standard et un shell non interactif se fermera.

Comment puis-je réparer cela?

Stefan Lasiewski
la source

Réponses:

11

Il s'agit d'un bogue dans les anciennes versions de bash, en particulier le niveau de patch 4.0 β2 d au niveau de patch 4.0 m. Du journal des modifications de 4.0 à 4.1 α:

n. Correction du comportement de set -upour se conformer à la dernière interprétation Posix: chaque expansion d'une variable non définie à l'exception de $ @ et $ * entraînera la fermeture du shell.

Ce comportement a été introduit dans la version 4.0β2 car le comportement précédent (et à nouveau actuel) était considéré comme bogué:

ré. Correction d'un bug qui empêchait les expansions de $ @ et $ * de quitter le shell si l'option -u était activée et qu'il n'y avait pas de paramètres de position.

Gilles 'SO- arrête d'être méchant'
la source