Dans bash
, avec le contexte de la test
commande deux arguments , -a file
et -e file
sont les mêmes. Mais ils ont une certaine différence, car -a
c'est aussi un opérateur binaire.
-e
unary est défini par POSIX, mais -a
unary ne l'est pas. POSIX définit uniquement le -a
binaire (voir test POSIX).
POSIX définit le test
comportement de trois arguments :
3 arguments:
Si $ 2 est un primaire binaire, effectuez le test binaire de $ 1 et $ 3.
Si $ 1 est '!', Annulez le test à deux arguments de $ 2 et $ 3.
Si $ 1 est '(' et 3 $ est ')', effectuez le test unaire de 2 $. Sur les systèmes qui ne prennent pas en charge l'option XSI, les résultats ne sont pas spécifiés si $ 1 est '(' et $ 3 est ')'.
Sinon, produisez des résultats non spécifiés.
Cela -a
conduit également à un résultat étrange:
$ [ ! -a . ] && echo true
true
-a
est considéré comme un opérateur binaire dans le contexte de trois arguments. Voir la question E1 de la FAQ Bash . POSIX mentionne également que cela -a
provient de KornShell mais a été changé plus tard en -e
car cela rend la confusion entre -a
binaire et -a
unaire.
Le -e primaire, possédant des fonctionnalités similaires à celles fournies par le shell C, a été ajouté car il fournit le seul moyen pour un script shell de savoir si un fichier existe sans essayer d'ouvrir le fichier. Étant donné que les implémentations sont autorisées à ajouter des types de fichiers supplémentaires, un script portable ne peut pas utiliser:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
pour savoir si foo est un fichier existant. Sur les systèmes BSD historiques, l'existence d'un fichier peut être déterminée par:
test -f foo -o -d foo
mais il n'y avait pas de moyen facile de déterminer qu'un fichier existant était un fichier normal. Une première proposition a utilisé le KornShell -a primaire (avec la même signification), mais cela a été changé en -e parce qu'il y avait des inquiétudes concernant la forte probabilité que les humains confondent le -a primaire avec l'opérateur binaire -a.
-a
binaire est également marqué comme obsolète, car il conduit à une expression ambiguë, qui a plus de 4 arguments. Avec ces expressions> 4 arguments, POSIX définit que le résultat n'est pas spécifié.