ในbash
กับบริบทของสองtest
คำสั่งอาร์กิวเมนต์-a file
และ-e file
เหมือนกัน แต่พวกเขามีความแตกต่างเพราะ-a
เป็นผู้ประกอบการแบบไบนารี
-e
unary ถูกกำหนดโดย POSIX แต่ไม่ใช่-a
unary POSIX กำหนด-a
ไบนารีเท่านั้น(ดูทดสอบ POSIX)
POSIX กำหนดtest
พฤติกรรมการขัดแย้งสามประการ:
3 ข้อโต้แย้ง:
ถ้า $ 2 เป็นไบนารีหลักให้ดำเนินการทดสอบไบนารีที่ $ 1 และ $ 3
หาก $ 1 คือ '!' ให้ปฏิเสธการทดสอบสองข้อโต้แย้งที่ $ 2 และ $ 3
หาก $ 1 คือ '(' และ $ 3 คือ ')' ให้ดำเนินการทดสอบ unary ที่ $ 2 บนระบบที่ไม่รองรับตัวเลือก XSI ผลลัพธ์จะไม่ถูกระบุหาก $ 1 คือ '(' และ $ 3 คือ ')'
มิฉะนั้นให้สร้างผลลัพธ์ที่ไม่ระบุ
ดังนั้น-a
ยังนำไปสู่ผลลัพธ์ที่แปลก:
$ [ ! -a . ] && echo true
true
-a
ถือเป็นผู้ประกอบการไบนารีในบริบทของสามข้อโต้แย้ง ดูทุบตีคำถามที่พบบ่อยคำถาม E1 POSIX ยังกล่าวถึงที่-a
ได้รับจาก KornShell แต่ถูกเปลี่ยนในภายหลัง-e
เพราะมันทำให้เกิดความสับสนระหว่าง-a
ไบนารีและ-a
unary
มีการเพิ่มฟังก์ชันหลัก -e ที่มีฟังก์ชันคล้ายกับที่ให้โดย C เชลล์เนื่องจากเป็นวิธีเดียวที่เชลล์สคริปต์จะค้นหาว่ามีไฟล์อยู่หรือไม่โดยไม่พยายามเปิดไฟล์ เนื่องจากการใช้งานได้รับอนุญาตให้เพิ่มประเภทไฟล์เพิ่มเติมสคริปต์แบบพกพาไม่สามารถใช้:
ทดสอบ -b foo -o -c foo -o -d foo -o -f foo -o -p foo
เพื่อค้นหาว่า foo เป็นไฟล์ที่มีอยู่หรือไม่ บนระบบ BSD ที่ผ่านมาการมีอยู่ของไฟล์สามารถกำหนดได้โดย:
ทดสอบ -f foo -o -d foo
แต่ไม่มีวิธีที่ง่ายในการพิจารณาว่าไฟล์ที่มีอยู่เป็นไฟล์ปกติ ข้อเสนอแรก ๆ ใช้ KornShell -a primary (ที่มีความหมายเหมือนกัน) แต่สิ่งนี้เปลี่ยนเป็น -e เพราะมีความกังวลเกี่ยวกับความน่าจะเป็นสูงของมนุษย์ที่ทำให้เกิดความสับสนหลัก -a กับตัวดำเนินการไบนารี
-a
ไบนารี่ถูกทำเครื่องหมายว่าล้าสมัยเพราะมันนำไปสู่การแสดงออกที่ไม่ชัดเจนซึ่งมีมากกว่า 4 ข้อโต้แย้ง ด้วยนิพจน์อาร์กิวเมนต์เหล่านี้> 4 POSIX จะกำหนดผลลัพธ์ที่ไม่ระบุ