Test POSIX e -a


9

Ho controllato una mia sceneggiatura con checkbashisms e ho ricevuto i seguenti avvisi:

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

Nella sezione 4.62.4 del POSIX specifiche trovo

primary -a primary Esegue un binario e dei risultati di primario e primario. L'operatore -a ha la precedenza sull'operatore -o.

Perché sono -ae -oconsiderati non-portatile?

Risposte:


11

Non è così tanto che non è portatile, ma che non esiste [un'implementazione in cui è affidabile quando vengono passati più di 4 argomenti.

Anche a bash:

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

La sezione relativa afferma:

> 4 argomenti :

I risultati non sono specificati.

[OB XSI] [Opzione Start] Su sistemi conformi a XSI, le combinazioni di primarie e operatori devono essere valutate utilizzando le regole di precedenza e associatività descritte in precedenza. Inoltre, le primarie binarie di confronto delle stringhe '=' e "! =" Devono avere una precedenza maggiore rispetto a qualsiasi primario unario. [Opzione fine]

-ae -odovrebbe essere vietato. Il modo giusto è invece usare gli operatori &&e || shell :

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

Lo trovo persino più leggibile.


Grazie, quindi l'unica soluzione sarebbe quella di avere due test? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo

3
Non l' unico, ma sicuramente il migliore e consigliato in sostituzione di -ae-o
Stéphane Chazelas,

Ok molte grazie (con solo intendo che non c'è modo di avere un singolo test ...).
Matteo,

1
Sì, potresti farlo [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](ancora non specificato secondo POSIX ma portatile e affidabile), oppure[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.