De man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Quelle est donc la différence entre
[ -a $FILE ]
et[ -e $FILE ]
, le cas échéant? - S'il n'y a pas de réelle différence, pourquoi existe-t-il deux drapeaux dans le même but?
Réponses:
Dans
bash
, avec le contexte de latest
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 :Cela
-a
conduit également à un résultat étrange:-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.-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é.la source
Il n'y a aucune différence.
En ligne
505-507
avectest.c
la version bash4.2.45(1)-release
:Cela indique qu'il n'y a pas de réelle différence entre les deux drapeaux.
Voir la réponse de gnouc .
la source
-a
s'agit également d' un opérateur booléen (et) dans bash, il semble sujet à des bogues d'ajouter cette signification supplémentaire qui est complètement redondante; Je suppose que c'est plus lié à la compatibilité avec une autre implémentation et / ou la compatibilité avec des versions antérieures qui n'en avaient pas-e
.-a
et . Mais certains obus (comme ) ont réussi à distinguer un argument d'un opérateur et les résultats n'étaient pas fiables. Depuis lors, POSIX a exigé que tout shell compatible gère au moins 4 arguments entre crochets.-o
[ test ]
bash
[ test ]
[ test ]
La meilleure réponse que j'ai trouvée est celle-ci, à partir d'une question StackOverflow:
la source