Rozważ ten fragment:
stop () {
echo "${1}" 1>&2
exit 1
}
func () {
if false; then
echo "foo"
else
stop "something went wrong"
fi
}
Zwykle func
wywołanie powoduje zakończenie skryptu, co jest zamierzonym zachowaniem. Jednak jeśli jest wykonywany w podpowłoce, na przykład w
result=`func`
nie wyjdzie ze skryptu. Oznacza to, że kod wywołujący musi za każdym razem sprawdzać status wyjścia funkcji. Czy istnieje sposób, aby tego uniknąć? Czy po to set -e
jest?
shell
shell-script
exit
subshell
Ernest AC
źródło
źródło
func
.Odpowiedzi:
Państwo mogłoby zabić oryginalną powłokę (
kill $$
) przed wywołaniemexit
, a to pewnie dzieło. Ale:Zamiast tego możesz użyć jednego z kilku sposobów przekazania wartości w Bash FAQ . Niestety większość z nich nie jest taka świetna. Być może utknąłeś sprawdzając błędy po każdym wywołaniu funkcji (
-e
ma wiele problemów ). Albo to, albo przejdź na Perla.źródło
Możesz zdecydować, że na przykład status wyjścia 77 oznacza wyjście z dowolnego poziomu podpowłoki i wykonaj
set -E
w połączeniu zERR
pułapkami przypomina trochę ulepszoną wersjęset -e
, ponieważ pozwala zdefiniować własną obsługę błędów.W zsh pułapki ERR są dziedziczone automatycznie, więc nie potrzebujesz
set -E
, możesz również definiować pułapki jakoTRAPERR()
funkcje i modyfikować je$functions[TRAPERR]
, np.functions[TRAPERR]="echo was here; $functions[TRAPERR]"
źródło
kill $$
.echo "$(exit 77)"
; scenariusz będzieecho ""
Alternatywnie
kill $$
, możesz również spróbowaćkill 0
, będzie działać w przypadku zagnieżdżonych podpowłok (wszystkie osoby wywołujące i proces poboczny otrzymają sygnał)… ale wciąż jest brutalny i brzydki.źródło
Spróbuj tego ...
Otrzymuję wyniki ...
Uwagi
if
testutrue
lubfalse
(patrz 2 przebiegi)if
testfalse
się kończy, nigdy nie osiągamy podpowłoki.źródło
(Odpowiedź specyficzna dla Bash) Bash nie ma pojęcia wyjątków. Jednak z zestawem -o errexit (lub odpowiednikiem: zestaw -e) na poziomie zewnętrznym nieudane polecenie spowoduje zamknięcie podpowłoki z niezerowym statusem wyjścia. Jeśli jest to zestaw zagnieżdżonych podpowłok bez warunków warunkowych wokół wykonywania tych podpowłok, skutecznie „zwija” cały skrypt i kończy działanie.
Może to być trudne przy próbie włączenia bitów różnych kodów bash do większego skryptu. Jedna porcja bash może działać sama, ale gdy zostanie wykonana w errexit (lub bez errexit), zachowuj się w nieoczekiwany sposób.
źródło
Mój przykład wyjścia w jednej linijce:
źródło