2016-08-09 76 views
1

Ich möchte einen Befehl auf bash, dass die Ausgabe von git status zeigt, aber nur wenn etwas Interessantes gibt. Mit anderen Worten: Wenn alles in Ordnung ist, möchte ich mit dem Befehl nichts drucken. Grundsätzlich kann ich dies erreichen, indem ausgeführt wird:Forward-Exit-Code in bash wenn

if [[ $(git status -s) ]]; then git status; fi 

Der Trick dabei ist, dass die -s Flagge nur etwas gibt, wenn es etwas interessant ist, so tut es genau das, was ich will :-)

Der einzige Nachteil Wenn ich das in einem Verzeichnis ausführe, das kein Git-Verzeichnis ist, bekomme ich keinen Exit-Code ungleich 0. Wenn ich git status oder git status -s direkt ausführen, schlagen beide mit Exit-Code 128 fehl. Aber sobald ich dies innerhalb der if mache, ist der Exit-Code 0.

Wie kann ich mein Skript verbessern, so dass der Exit-Code weitergeleitet wird?

+0

Welche Exit-Code nicht 'git status -s' geben, wenn nichts Interessantes passiert ist? – 123

+0

Es gibt '0' zurück, aber die Ausgabe selbst ist leer. –

Antwort

1

Sie die Exit-Status Prüfung innerhalb [[ zu:

if [[ -n $(git status -s 2>/dev/null) ]]; then git status; fi 
+0

oder nur 'wenn git status -s 2>/dev/null; dann git status ' – 123

+0

@ 123 Das war der Plan, aber OP möchte die Ausgabe-String überprüfen .. – heemayl

+0

Gibt' git status -s' true zurück, auch wenn nichts von Interesse ist dann passiert? – 123

1

umleiten einfach auf/dev/null und prüfen, ob die Ausgabe leer ist oder nicht:

[ -n "$(git status -s 2>/dev/null)" ] && git status 

Diese git status durchführen wird, wenn die git status -s Befehl läuft erfolgreich und seine Ausgabe ist nicht leer, wie man test:

-n STRING 
      the length of STRING is nonzero 
+0

Leider funktioniert das nicht: Es leitet den Exit-Code korrekt weiter, unterdrückt aber die Ausgabe nicht, wenn nichts Interessantes zu sehen ist. –

+0

@GoloRoden Sie haben Recht, ich habe aktualisiert. – fedorqui

1

Sie können das Verzeichnis nicht in gitrev-parse verwenden, falls:

git rev-parse 2>/dev/null && { git status -s || git status; }