Korzystam z następujących opcji
set -o pipefail
set -e
W skrypcie bash, aby zatrzymać wykonywanie po błędzie. Mam ~ 100 wierszy skryptu i nie chcę sprawdzać kodu powrotu każdej linii w skrypcie.
Ale w przypadku jednego konkretnego polecenia chcę zignorować błąd. Jak mogę to zrobić?
-e
atrybut jest ustawiony ”, jeśli polecenie, które się nie powiedzie, jest częścią listy poleceń bezpośrednio po słowie kluczowymwhile
lub,until
słowem kluczowym, testem wif
instrukcji, częścią dowolnego wykonanego polecenia na liście&&
lub||
poza poleceniem następującym po ostatnim&&
lub||
dowolnym poleceniu w potoku, ale ostatnim, lub jeśli status powrotu polecenia jest odwracany za pomocą!
. ”(ldd $2/bin/* || true) | grep "not found" | wc -l
skrypt kończy się po tej linii, gdy błąd powrotu ldd(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. gdygrep
nic nie znajdzie, zwraca niezerowy kod wyjścia i wystarczy, że powłoka pomyśli, że cały potok ma niezerowy kod wyjścia.Po prostu dodaj
|| true
po poleceniu, w którym chcesz zignorować błąd.źródło
set -e
i próbujesz uchwycić komunikat o błędzie: np.set -e; TEST=$(foo 2>&1 || true); echo $TEST
Nie zatrzymuj się, a także zapisz status wyjścia
Na wszelki wypadek, jeśli chcesz, aby skrypt nie zatrzymywał się w przypadku niepowodzenia określonego polecenia, a także chcesz zapisać kod błędu nieudanego polecenia:
źródło
command
był udany i trzeba uruchomić to, co jest później||
. czytaj to tak: jeśli sięcommand
nie powiedzie, zróbEXIT_CODE=$?
. Prawdopodobnie możesz po prostucommand || echo "$?"
użyć lub użyć „pułapki”, aby uzyskać bardziej szczegółowe debugowanie. Zobacz to -> stackoverflow.com/a/6110446/10737630Bardziej zwięźle:
Ze specyfikacji POSIX dotyczącej
set -e
(mój nacisk):źródło
-e
.!
zapobiegnie wyjściu pocisku bez względu na wszystko. Ten skrypt wyświetla komunikatStill alive!
po uruchomieniu, wskazując, że skrypt został uruchomiony do końca. Czy widzisz inne zachowanie?if
klauzuli i rozwiązałem problem.Zamiast „zwracania prawdy” można również użyć narzędzia „noop” lub zerowego (jak podano w specyfikacji POSIX )
:
i po prostu „nic nie robić”. Zaoszczędzisz kilka liter. :)źródło
Jeśli chcesz zapobiec awarii skryptu i zebrać kod powrotu:
returncode
jest gromadzony bez względu na to, czy polecenie się powiedzie, czy nie.źródło
Korzystam z poniższego fragmentu podczas pracy z narzędziami CLI i chcę wiedzieć, czy jakiś zasób istnieje, czy nie, ale nie dbam o wynik.
źródło
if [ -r not_exist ]
Podoba mi się to rozwiązanie:
Wykonywane jest polecenie / skrypt między tylnymi tyknięciami, a jego dane wyjściowe są podawane do polecenia „:” (co jest odpowiednikiem „true”)
edycja: Naprawiono brzydką literówkę
źródło
chociaż
|| true
jest preferowany, ale możesz takżeźródło
Odtąd nie działały dla mnie żadne rozwiązania, więc znalazłem inne:
Jest to przydatne w przypadku CI i CD. W ten sposób komunikaty o błędach są drukowane, ale cały skrypt jest nadal wykonywany.
źródło
Przykład użycia tego do utworzenia pliku dziennika
źródło
Dzięki za proste rozwiązanie tutaj z góry:
Poniższa konstrukcja może być wykorzystana do dodatkowych działań / rozwiązywania problemów ze skryptami i dodatkowych opcji kontroli przepływu:
Możemy zahamować dalsze działania i w
exit 1
razie potrzeby.źródło