Jak napisać skrypt powłoki, który kończy działanie, jeśli jedna jego część zawiedzie? Na przykład jeśli poniższy fragment kodu nie powiedzie się, skrypt powinien zakończyć działanie.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
źródło
źródło
set -e
. Jednak tak naprawdę nie ma tutaj zastosowania. OP chce wyjść ze skryptu po 5 nieudanych próbach uruchomienia polecenia.set -e
to jedyny sposób, w jaki mogę to zrobić.set -e
tosleep
(break
specjalne wbudowanie spowoduje, że skrypt zakończy działanie po awarii w większości powłok, na komendy wif
lub po lewej stronie&&
nie ma wpływuset -e
,n=...
może się nie powieść, jeślin
jest tylko do odczytu, ale wtedy bez niegoset -e
również wyjdzie ze skryptu ), więc interpretacja wydaje się mało prawdopodobna. Zgadzam się, że pytanie jest źle sformułowane.Możesz wyjść ze skryptu w dowolnym miejscu za pomocą słowa kluczowego
exit
. Możesz także podać kod zakończenia, aby wskazać innym programom, że skrypt nie powiódł się, np.exit 1
Lubexit 2
itp. (Zgodnie z konwencją kod wyjścia 0 oznacza sukces, a wartość większa od 0 oznacza niepowodzenie; jednak również zgodnie z konwencją wyjście kody powyżej 127 są zarezerwowane dla nienormalnego zakończenia (np. przez sygnał)).Ogólna konstrukcja wyjścia w przypadku awarii jest
z odpowiednim
failure condition
in
. Ale w określonych scenariuszach możesz postępować inaczej. Teraz dla twojej sprawy interpretuję twoje pytanie, że jeśli któreś z pięciu wezwańgksu
nie powiedzie się, to masz zamiar wyjść. Jednym ze sposobów jest użycie takiej funkcjia następnie wywołaj pętlę przez
try_command
.Istnieją (bardziej) zaawansowane lub wyrafinowane sposoby rozwiązania twojego pytania. Jednak powyższe rozwiązanie jest bardziej dostępne dla początkujących niż, powiedzmy, rozwiązanie Stephane.
źródło
exit
kończy skrypt, chyba że jest wywoływany w podpowłoce. Jeśli ta część skryptu jest w podpowłoce, na przykład dlatego, że znajduje się wewnątrz(...)
lub$(...)
lub część rurociągiem, wtedy wyjść tylko , że powłoki w tle .W takim przypadku, jeśli chcesz, aby skrypt zakończył działanie oprócz podpowłoki, musisz wywołać
exit
wyjście z tej podpowłoki.Na przykład tutaj z 2 zagnieżdżonymi poziomami podpowłoki:
Może stać się trudniejsze, jeśli podpowłoka jest częścią potoku.
bash
posiada specjalną$PIPESTATUS
tablicę, podobną dozsh
„s$pipestatus
jednym, które mogą Ci pomóc tutaj:źródło
Pułapka wykona akcję po otrzymaniu sygnału.
Uruchom to i pozwól mu wyjść normalnie. Zatrzymuje sygnał 0.
Uruchom go ponownie i przerwij za pomocą ^ C. Przechwytuje sygnał 2 i sygnał 0.
Niezerowy status wyjścia będzie pułapką na ERR
źródło