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ć?


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

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.


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.