Bash: Führen Sie command2 aus, wenn command1 fehlschlägt

43

Ich möchte so etwas machen:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

Wie soll ich das machen

Michelemarcon
quelle
1
Sie vermissen nur das Schlüsselwort "then" vor dem Befehl "echo success".
Glenn Jackman
10
Hmmm; Ihr Pseudocode scheint eine andere Frage zu stellen als die in Ihrem Titel .....
mattdm
Gute Ressource für einige Shell-Scripting-Exit-Bedingungen pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Antworten:

71

Diese sollten das tun, was Sie brauchen:

cmd1 && cmd2 && echo success || echo epic fail

oder

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
quelle
3
Das funktioniert, aber ich bin verwirrt, warum ich ||nicht auf die Ausgabe des ersten echoBefehls schaue .
mlissner
1
@mlissner, das if else erwartet Exit-Codes, 0, wenn der Befehl gestartet wurde und 1, wenn Fehler aufgetreten sind. Lesen Sie nicht am Ausgang. Just try whoami && whoami && echo success || echo epic failund jetzt whoami && whoareyou && echo success || echo epic fail. Ich kann nicht herausfinden, was Sie mit "Nicht auf die Ausgabe des ersten
Echobefehls
@mlissner Ich glaube, ich habe Ihre Frage bekommen, aber die Antwort ist, dass der Echo-Befehl niemals fehlschlagen wird. Das heißt, seine Rückgabe ist 0, dh wahr. Die Bedingung, die wirklich wichtig ist, ist also nurcmd1 && cmd2
Kazim Zaidi
22

Petr Uzel ist genau richtig, aber Sie können auch mit dem magischen Geld spielen.

$? Enthält den Exit-Code des zuletzt ausgeführten Befehls. Wenn Sie diesen verwenden, können Sie Ihre Skripte sehr flexibel schreiben.

Diese Frage berührt dieses Thema ein wenig, Best Practice zu verwenden $? in der Bash? .

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

Dann können Sie auch auf verschiedene Exit-Codes reagieren und verschiedene Dinge tun, wenn Sie möchten.

Johan
quelle
1
Mein Unternehmen, PHP Experts, Inc., und ich möchten uns bei Ihnen dafür bedanken, dass Sie ein wesentlicher Bestandteil unseres internen CI-Skripts sind. Danke!
Theodore R. Smith
7

Der Pseudocode in der Frage entspricht nicht dem Titel der Frage.

Wenn jemand tatsächlich wissen muss, wie Befehl 2 ausgeführt wird, wenn Befehl 1 fehlschlägt, ist dies eine einfache Erklärung:

  • cmd1 || cmd2: Dies wird ausgeführt cmd1, und im Falle eines Fehlers wird es ausgeführtcmd2
  • cmd1 && cmd2: Dies wird ausgeführt cmd1, und im Erfolgsfall wird es ausgeführtcmd2
  • cmd1 ; cmd2: Dies wird ausgeführt cmd1, und dann wird es ausgeführt cmd2, unabhängig vom Fehlschlagen oder Erfolg der Ausführung cmd1.
Orlando Rivera Letelier
quelle