Wie negieren Sie einen Test in bash, wenn Sie mehrere Tests kombinieren möchten?Wo negativer logischer Ausdruck in Bash
Der Code ist
if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then
echo starting xvfb
mkdir -p /tmp/xvfb
Xvfb :1 -fbdir /tmp/xvfb > /tmp/xvfb_output 2>&1 &
export DISPLAY=:1
fi
Es soll bezogen werden und Xvfb zu starten, wenn nicht bereits ausgeführt wird. Zuvor fehlte der || [ ! -v DISPLAY ]
Teil, um das Vorhandensein der Variablen zu überprüfen.
Um einen Test zu negieren, könnten Sie entweder ! [ ... ]
oder [ ! ... ]
tun, die beide zu funktionieren scheinen.
Ist die Argumentation richtig, dass Sie [ ! ...]
verwenden sollten, weil es innerhalb des Tests und somit klarer (und ein bisschen effizienter) ist?
Umschreiben als UND-Klausel war mir nicht eingefallen. Vielen Dank. Denken Sie über das 'if! (test ... 'Zeile besser lesbar als die' if [! ... 'Zeile? –
@user Ja, ich bevorzuge eigentlich den 'test expr' Ausdruck zu' [expr] 'im Allgemeinen. Ich finde die Klammern schwer in Dieser Fall, vor allem, weil die Endklammer meiner Erfahrung nach nie nützlich ist, um das Ende einer Bedingung im Shell-Scripting zu erkennen.Natürlich ist das nur meine Meinung :-) Verwenden Sie Klammern, wenn Sie diese Notation bevorzugen. –
'[$ (pgrep Xvfb)]' ist ein Fehler an und für sich. Sie hoffen *, dass die Ausgabe von 'pgrep' eine gültige, nicht leere Zeichenkette sein wird, so dass der' [...] 'Test besteht. Aber das ist nicht zuverlässig oder eine gute Idee. Zum Glück (weil es gesund ist) hat 'pgrep' aussagekräftige Rückgabewerte. Also, um zu testen, dass es etwas gefunden hat, das du willst 'if pgrep Xvfb &>/dev/null; dann echo "tu etwas, jetzt wo wir Xvfb gefunden haben"; fi'. Für diesen Fall wäre das "wenn! pgrep Xfvb &>/dev/null || [! -v ANZEIGE]; dann ....; fi'. Ich beachte auch, dass Xvfb mehr als einmal ausgeführt wird, wenn "DISPLAY" deaktiviert wird, was möglicherweise nicht das ist, was Sie wollen. –