Dans bash, avec le contexte de la testcommande deux arguments , -a fileet -e filesont les mêmes. Mais ils ont une certaine différence, car -ac'est aussi un opérateur binaire.
-eunary est défini par POSIX, mais -aunary ne l'est pas. POSIX définit uniquement le -abinaire (voir test POSIX).
POSIX définit le testcomportement 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 -aconduit également à un résultat étrange:
$ [ ! -a . ] && echo true
true
-aest 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 -aprovient de KornShell mais a été changé plus tard en -ecar cela rend la confusion entre -abinaire et -aunaire.
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.
-abinaire 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é.