2016-04-07 10 views
1

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?

Antwort

1

Ich bin ziemlich sicher, dass es egal ist, wo Sie die Negation in Bezug auf Effizienz setzen.

if ! (test "$(pgrep Xvfb)" -a -n "${DISPLAY:+1}"); then

So kann man nur eine Negation auf der einen Test haben: Wie zur besseren Lesbarkeit, könnten Sie Ihre if Anweisung wie folgt schreiben.

Ich stimme Ihnen zu, dass

if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

mehrdeutig ist und

if [ ! $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

nicht.

+0

Umschreiben als UND-Klausel war mir nicht eingefallen. Vielen Dank. Denken Sie über das 'if! (test ... 'Zeile besser lesbar als die' if [! ... 'Zeile? –

+1

@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. –

+0

'[$ (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. –