Trong bash
, với bối cảnh của hai test
lệnh đối số , -a file
và -e file
giống nhau. Nhưng họ có một số khác biệt, bởi vì -a
cũng là một toán tử nhị phân.
-e
unary được định nghĩa bởi POSIX, nhưng -a
unary thì không. POSIX chỉ định nghĩa -a
nhị phân (Xem POSIX thử nghiệm ).
POSIX định nghĩa ba test
hành vi đối số :
3 đối số:
Nếu $ 2 là số chính nhị phân, hãy thực hiện kiểm tra nhị phân $ 1 và $ 3.
Nếu $ 1 là '!', Hãy phủ nhận bài kiểm tra hai đối số là $ 2 và $ 3.
Nếu $ 1 là '(' và $ 3 là ')', hãy thực hiện kiểm tra đơn phương là $ 2. Trên các hệ thống không hỗ trợ tùy chọn XSI, kết quả không được chỉ định nếu $ 1 là '(' và $ 3 là ')'.
Nếu không, tạo ra kết quả không xác định.
Vì vậy, -a
cũng dẫn đến kết quả kỳ lạ:
$ [ ! -a . ] && echo true
true
-a
được coi là toán tử nhị phân trong bối cảnh của ba đối số. Xem Bash FAQ câu hỏi E1 . POSIX cũng đề cập đến việc -a
lấy từ KornShell nhưng sau đó đã được thay đổi thành -e
vì nó gây nhầm lẫn giữa -a
nhị phân và -a
đơn nguyên.
Chính -e, sở hữu chức năng tương tự như được cung cấp bởi trình bao C, đã được thêm vào vì nó cung cấp cách duy nhất cho tập lệnh shell để tìm hiểu xem một tệp có tồn tại mà không cố mở tệp không. Vì việc triển khai được phép thêm các loại tệp bổ sung, tập lệnh di động không thể sử dụng:
kiểm tra -b foo -o -c foo -o -d foo -o -f foo -o -p foo
để tìm hiểu xem foo là một tập tin hiện có. Trên các hệ thống BSD lịch sử, sự tồn tại của một tệp có thể được xác định bởi:
kiểm tra -f foo -o -d foo
nhưng không có cách nào dễ dàng để xác định rằng một tệp hiện có là một tệp thông thường. Một đề xuất ban đầu đã sử dụng KornShell -a chính (có cùng ý nghĩa), nhưng điều này đã được đổi thành -e vì có những lo ngại về khả năng cao con người nhầm lẫn giữa -a chính với toán tử nhị phân -a.
-a
nhị phân cũng được đánh dấu là lỗi thời, bởi vì nó dẫn đến một số biểu thức mơ hồ, có lớn hơn 4 đối số. Với biểu thức> 4 đối số này, POSIX xác định kết quả là không xác định.