Bash: uruchom polecenie 2, jeśli polecenie 1 nie powiedzie się

43

Chcę zrobić coś takiego:

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

Jak mam to zrobić?

michelemarcon
źródło
1
Po prostu brakuje słowa kluczowego „wtedy” przed poleceniem „sukces echa”.
glenn jackman
10
Hmmm; twój pseudokod wydaje się zadawać inne pytanie niż to w twoim tytule .....
mattdm
Dobry zasób dla niektórych warunków wyjścia ze skryptów powłoki pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Odpowiedzi:

71

Powinny zrobić to, czego potrzebujesz:

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

lub

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
źródło
3
To działa, ale jestem zdezorientowany, dlaczego ||nie patrzy na wynik pierwszego echopolecenia.
mlissner,
1
@mlissner, jeśli inny spodziewa się wyjść z kodów, 0, jeśli polecenie zostało uruchomione, i 1, jeśli wystąpiły błędy. Nie czytaj na wyjściu. Just try whoami && whoami && echo success || echo epic faili teraz whoami && whoareyou && echo success || echo epic fail. Nie mogę zrozumieć, co masz na myśli mówiąc „nie patrzy na wynik pierwszego polecenia echa”
erm3nda
@mlissner Myślę, że dostałem twoje pytanie, ale odpowiedź brzmi, że polecenie echa nigdy nie zawiedzie. Oznacza to, że jego zwrot wyniesie 0, tzn. Prawda. Tak więc warunek, który naprawdę ma znaczenie, to po prostucmd1 && cmd2
Kazim Zaidi
22

Petr Uzel jest na miejscu, ale możesz także grać z magicznym $ ?.

$? przechowuje kod wyjścia z ostatniego wykonanego polecenia, a jeśli go użyjesz, możesz pisać skrypty dość elastycznie.

To pytanie dotyczy nieco tego tematu. Najlepsza praktyka używania $? w bash? .

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

Następnie możesz reagować na różne kody wyjścia i robić różne rzeczy, jeśli chcesz.

Johan
źródło
1
Moja firma, PHP Experts, Inc. i ja pragniemy podziękować za to, że jesteś integralną częścią naszego wewnętrznego skryptu CI. Dziękuję Ci!
Theodore R. Smith
7

Pseudokod w pytaniu nie odpowiada tytułowi pytania.

Jeśli ktoś musi wiedzieć, jak uruchomić polecenie 2, jeśli polecenie 1 nie powiedzie się, to proste wyjaśnienie:

  • cmd1 || cmd2: Uruchomi się cmd1, aw przypadku awarii uruchomi sięcmd2
  • cmd1 && cmd2: Uruchomi się cmd1, a w przypadku sukcesu uruchomi sięcmd2
  • cmd1 ; cmd2: Uruchomi się cmd1, a następnie uruchomi cmd2, niezależnie od awarii lub powodzenia działania cmd1.
Orlando Rivera Letelier
źródło