In bash
, con il contesto del test
comando due argomenti , -a file
e -e file
sono uguali. Ma hanno qualche differenza, perché -a
è anche un operatore binario.
-e
unario è definito da POSIX, ma -a
unario no. POSIX definisce solo -a
binario (vedi test POSIX).
POSIX definisce il test
comportamento di tre argomenti :
3 argomenti:
Se $ 2 è un primario binario, eseguire il test binario di $ 1 e $ 3.
Se $ 1 è '!', Annulla il test a due argomenti di $ 2 e $ 3.
Se $ 1 è '(' e $ 3 è ')', esegui il test unario di $ 2. Sui sistemi che non supportano l'opzione XSI, i risultati non sono specificati se $ 1 è '(' e $ 3 è ')'.
Altrimenti, produce risultati non specificati.
Quindi -a
porta anche a strani risultati:
$ [ ! -a . ] && echo true
true
-a
è considerato operatore binario nel contesto di tre argomenti. Vedi la domanda frequente Bash E1 . POSIX menziona anche che -a
è stato ottenuto da KornShell ma è stato modificato in seguito -e
perché crea confusione tra -a
binario e -a
unario.
Il primario -e, che possiede funzionalità simili a quelle fornite dalla shell C, è stato aggiunto perché fornisce l'unico modo per uno script di shell di scoprire se esiste un file senza provare ad aprire il file. Poiché alle implementazioni è consentito aggiungere altri tipi di file, uno script portatile non può utilizzare:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
per scoprire se foo è un file esistente. Sui sistemi BSD storici, l'esistenza di un file potrebbe essere determinata da:
test -f foo -o -d foo
ma non c'era modo semplice per determinare che un file esistente era un file normale. Una prima proposta utilizzava il KornShell -a primario (con lo stesso significato), ma questo è stato cambiato in -e perché c'erano preoccupazioni sull'alta probabilità che gli umani confondessero il -a primario con l'operatore binario -a.
-a
binario è anche contrassegnato come obsoleto, perché porta a qualche espressione ambigua, che ha più di 4 argomenti. Con l'espressione di questi> 4 argomenti, POSIX definisce il risultato non specificato.