Kiểm tra POSIX và -a


9

Tôi đã kiểm tra một tập lệnh của tôi với các biểu tượng kiểm tra và tôi nhận được các cảnh báo sau:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

Trong phần 4.62.4 của thông số kỹ thuật POSIX tôi tìm thấy

sơ cấp -a chính Thực hiện nhị phân và kết quả của chính và chính. Toán tử -a được ưu tiên hơn toán tử -o.

Tại sao -a-ođược coi là không di động?

Câu trả lời:


11

Nó không quá nhiều đến nỗi nó không thể mang theo được, nhưng không có [triển khai nào đáng tin cậy khi vượt qua hơn 4 đối số.

Ngay cả trong bash:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

Phần liên quan nêu:

> 4 đối số :

Kết quả là không xác định.

[OB XSI] [Bắt đầu tùy chọn] Trên các hệ thống tuân thủ XSI, sự kết hợp giữa các nguyên tắc và toán tử sẽ được đánh giá bằng cách sử dụng các quy tắc ưu tiên và kết hợp được mô tả trước đây. Ngoài ra, các nguyên hàm nhị phân so sánh chuỗi '=' và "! =" Sẽ có độ ưu tiên cao hơn bất kỳ số nguyên tố đơn nguyên nào. [Kết thúc tùy chọn]

-a-onên bị cấm. Cách đúng là sử dụng các toán tử shell&& và thay thế:||

if [ -n "$foo" ] && [ -n "$bar" ]; then

Tôi thậm chí còn thấy nó dễ đọc hơn.


Cảm ơn, vậy giải pháp duy nhất là có hai bài kiểm tra? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo

3
Không phải là người duy nhất nhưng chắc chắn là người tốt nhất và được đề nghị thay thế -a-o
Stéphane Chazelas

Ok cảm ơn rất nhiều (chỉ có ý tôi là không có cách nào để có một bài kiểm tra duy nhất ...).
Matteo

1
Có, bạn có thể làm [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](vẫn chưa được chỉ định theo POSIX nhưng di động và đáng tin cậy), hoặc[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.