Dari man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Jadi apa perbedaan antara
[ -a $FILE ]
dan[ -e $FILE ]
, jika ada? - Jika tidak ada perbedaan nyata, mengapa ada dua bendera untuk tujuan yang sama?
Jawaban:
Di
bash
, dengan kontekstest
perintah dua argumen ,-a file
dan-e file
sama. Tetapi mereka memiliki beberapa perbedaan, karena-a
juga merupakan operator biner.-e
unary didefinisikan oleh POSIX, tetapi-a
unary tidak. POSIX hanya mendefinisikan-a
biner (Lihat tes POSIX).POSIX mendefinisikan tiga
test
perilaku argumen :Demikian
-a
juga mengarah pada hasil yang aneh:-a
dianggap sebagai operator biner dalam konteks tiga argumen. Lihat Bash FAQ pertanyaan E1 . POSIX juga menyebutkan bahwa-a
dapatkan dari KornShell tetapi kemudian diubah menjadi-e
karena membuat membingungkan antara-a
biner dan-a
unary.-a
biner juga ditandai sebagai usang, karena mengarah ke beberapa ekspresi ambigu, yang memiliki lebih dari 4 argumen. Dengan> 4 argumen argumen ini, POSIX mendefinisikan hasilnya tidak ditentukan.sumber
Tidak ada perbedaan sama sekali.
Sejalan
505-507
ditest.c
versi pesta4.2.45(1)-release
:Itu menunjukkan bahwa tidak ada perbedaan nyata antara kedua bendera.
Lihat jawaban gnouc .
sumber
-a
ini juga operator boolean (dan) di bash, tampaknya bug rawan untuk menambahkan makna tambahan yang benar-benar berlebihan; Saya kira itu lebih terkait dengan kompatibilitas dengan beberapa implementasi lain dan / atau kompatibilitas dengan versi sebelumnya yang tidak memiliki-e
.-a
dan-o
booleans untuk[ test ]
. Tetapi beberapa cangkang (sepertibash
) mengisap membedakan argumen dari operator dan[ test ]
hasilnya tidak dapat diandalkan. Sejak saat itu POSIX telah mewajibkan bahwa setiap shell yang sesuai menangani setidaknya 4 argumen dalam[ test ]
tanda kurung.Jawaban terbaik yang saya temukan adalah ini, dari pertanyaan StackOverflow:
sumber