Komenda set -e powoduje, że skrypt bash kończy się niepowodzeniem natychmiast, gdy dowolne polecenie zwróci niezerowy kod wyjścia.
Czy istnieje prosty i elegancki sposób na wyłączenie tego zachowania dla pojedynczego polecenia w skrypcie?
W jakich miejscach ta funkcja jest udokumentowana w Bash Reference Manual ( http://www.gnu.org/software/bash/manual/bashref.html )?
Alternatywą dla unieruchomienia kaucji za błąd byłoby wymuszenie sukcesu bez względu na wszystko. Możesz zrobić coś takiego:
Zwróci to 0 (prawda), więc zestaw -e nie powinien być wyzwalany
źródło
faulty_cmd || :
jest kolejnym popularnym idiomem tego. (To:
polecenie jest synonimemtrue
).Jeśli próbujesz złapać kod powrotu / błędu (funkcja lub rozwidlenie), działa to:
źródło
To, czy „opcja natychmiastowego wyjścia z powłoki” ma zastosowanie lub jest ignorowane, zależy od kontekstu wykonanego polecenia (zobacz sekcję Bash Reference Manual wbudowanego zestawu - dzięki Arkadiusz Drabczyk).
W szczególności opcja jest ignorowana, jeśli polecenie jest częścią testu w instrukcji if. Dlatego możliwe jest wykonanie polecenia i sprawdzenie jego powodzenia lub niepowodzenia w „kontekście natychmiastowego wyjścia” za pomocą instrukcji if, takiej jak ta:
Można pominąć instrukcję „then” i użyć mniejszej liczby wierszy:
źródło
Właściwie miałem ostatnio podobne pytanie (chociaż nie opublikowałem, zająłem się tym) i, z tego, co widzę, wygląda na to, że po prostu używam set + e przed poleceniem, a później zestaw -e działa najbardziej elegancko. Oto przykład, łapiąc odpowiedź polecenia i nie pozwalając, by błąd go wyrzucił.
Pobiera to wynik „fortuny”, sprawdza jego status wyjścia, a także odbija się echem i mówi. Myślę, że o to prosiłeś, a przynajmniej coś podobnego? W każdym razie mam nadzieję, że to pomoże.
źródło
Lubię uruchamiać podpowłokę, jeśli chcę coś tymczasowo zmienić. Poniższa komenda pokazuje, że pierwsza komenda bad_comm jest ignorowana, a druga przerywa wykonywanie.
źródło
Kolejne podejście, które wydaje mi się dość proste (i dotyczy innych
set
opcji oprócz-e
):Skorzystaj z,
$-
aby przywrócić ustawienia.Na przykład:
Choć
-e
konkretnie, opcje, o których wspominali inni (|| true
lub „umieszczają w środkuif
”), mogą być bardziej idiomatyczne.źródło