Test POSIX et -a


9

J'ai vérifié un de mes scripts avec checkbashisms et j'ai reçu les avertissements suivants:

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

Dans la section 4.62.4 des spécifications POSIX, je trouve

primary -a primary Exécute un binaire et des résultats de primaire et primaire. L'opérateur -a a priorité sur l'opérateur -o.

Pourquoi -aet -oconsidérés comme non portables?

Réponses:


11

Ce n'est pas tant qu'il n'est pas portable, mais qu'il n'y a pas d' [implémentation où il est fiable lorsqu'il passe plus de 4 arguments.

Même en bash:

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

La section connexe indique:

> 4 arguments :

Les résultats ne sont pas précisés.

[OB XSI] [Option Start] Sur les systèmes conformes à XSI, les combinaisons de primaires et d'opérateurs doivent être évaluées en utilisant les règles de priorité et d'associativité décrites précédemment. De plus, les primaires binaires de comparaison de chaînes '=' et "! =" Doivent avoir une priorité plus élevée que tout primaire unaire. [Fin de l'option]

-aet -odevrait être interdit. La bonne façon est d'utiliser les opérateurs shell&& et à la place:||

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

Je le trouve même plus lisible.


Merci, donc la seule solution serait d'avoir deux tests? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo

3
Pas le seul mais certainement le meilleur et recommandé en remplacement de -aet-o
Stéphane Chazelas

Ok merci beaucoup (avec seulement je voulais dire qu'il n'y a aucun moyen d'avoir un seul test ...).
Matteo

1
Oui, vous pourriez le faire [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](toujours non spécifié selon POSIX mais portable et fiable), ou[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.