Tes POSIX dan -a

9

Saya memeriksa naskah saya dengan checkbashisms dan saya mendapat peringatan berikut:

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

Di bagian 4.62.4 dari spesifikasi POSIX yang saya temukan

primary -a primer Melakukan biner dan hasil primer dan primer. Operator -a lebih diutamakan daripada operator -o.

Mengapa -adan -odianggap non-portabel?

Matteo
sumber

Jawaban:

11

Ini tidak begitu banyak sehingga tidak portabel, tetapi bahwa tidak ada [implementasi di mana itu dapat diandalkan ketika melewati lebih dari 4 argumen.

Bahkan dalam bash:

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

Bagian terkait menyatakan:

> 4 argumen :

Hasilnya tidak ditentukan.

[OB XSI] [Opsi Mulai] Pada sistem yang sesuai dengan XSI, kombinasi primary dan operator harus dievaluasi menggunakan aturan presedensi dan asosiatif yang dijelaskan sebelumnya. Selain itu, perbandingan primer dengan biner '=' dan "! =" Akan memiliki prioritas lebih tinggi daripada primer apa pun. [Opsi Berakhir]

-adan -oharus dilarang. Cara yang benar adalah menggunakan operator shell&& dan sebagai gantinya:||

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

Saya bahkan merasa lebih terbaca.

Stéphane Chazelas
sumber
Terima kasih, jadi satu-satunya solusi adalah memiliki dua tes? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo
3
Bukan satu - satunya tapi tentu saja yang terbaik dan direkomendasikan sebagai pengganti -adan-o
Stéphane Chazelas
Ok terima kasih banyak (dengan hanya saya maksudkan bahwa tidak ada cara untuk memiliki tes tunggal ...).
Matteo
1
Ya, Anda bisa melakukannya [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](masih belum ditentukan sesuai POSIX tetapi portabel dan dapat diandalkan), atau[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas