POSIX-Test und -a

9

Ich habe ein Skript von mir mit Checkbashisms überprüft und die folgenden Warnungen erhalten:

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

In Abschnitt 4.62.4 der POSIX-Spezifikationen finde ich

Primär -a Primär Führt eine Binärdatei und die Ergebnisse von Primär und Primär aus. Der Operator -a hat Vorrang vor dem Operator -o.

Warum sind -aund gelten sie -oals nicht tragbar?

Matteo
quelle

Antworten:

11

Es ist nicht so sehr, dass es nicht portabel ist, aber dass es keine [Implementierung gibt, bei der es zuverlässig ist, wenn mehr als 4 Argumente übergeben werden.

Sogar in Bash:

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

Der zugehörige Abschnitt lautet:

> 4 Argumente :

Die Ergebnisse sind nicht spezifiziert.

[OB XSI] [Optionsstart] Bei XSI-konformen Systemen müssen Kombinationen von Primär- und Operatoren anhand der zuvor beschriebenen Prioritäts- und Assoziativitätsregeln bewertet werden. Außerdem haben die binären Zeichenfolgenvergleichsprimären '=' und "! =" Eine höhere Priorität als alle unären Primärdaten. [Optionsende]

-aund -osollte verboten werden. Der richtige Weg ist der zu verwenden &&und || Shell - Betreiber statt:

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

Ich finde es sogar besser lesbar.

Stéphane Chazelas
quelle
Danke, die einzige Lösung wäre also, zwei Tests zu haben? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo
3
Nicht der einzige , aber sicherlich der beste und empfohlene als Ersatz für -aund-o
Stéphane Chazelas
Ok, vielen Dank (nur ich meinte, dass es keine Möglichkeit gibt, einen einzigen Test durchzuführen ...).
Matteo
1
Ja, Sie könnten tun [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](noch nicht spezifiziert gemäß POSIX, aber tragbar und zuverlässig), oder[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas