Używam set -e
do zatrzymania skryptu bash przy pierwszym błędzie .
Wszystko działa OK, chyba że użyję polecenia z &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
w porównaniu z:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
Pierwszy przykład wciąż się powtarza I'm running!
, ale drugi nie. Dlaczego zachowują się inaczej?
UPD. Podobne pytanie: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907th
źródło
źródło
cd
poleceniuset -e
zachowanie jest zaskakujące.Odpowiedzi:
Jest to udokumentowane zachowanie. (1) Strona bash człowiek mówi, dla
set -e
,A specyfikacja języka poleceń powłoki POSIX potwierdza, że jest to prawidłowe zachowanie:
oraz Sekcja 2.9.3. Definicje list tego dokumentu
źródło
Ta
set -e
opcja nie działa w niektórych sytuacjach, a jest to standardowe zachowanie i przenośność w powłoce zgodnej z POSIX.Nieudane polecenie jest częścią potoku:
wydrukuje
printed
.I brana jest pod uwagę tylko awaria samego rurociągu:
nic nie wydrukuje.
Nieudany run komenda w liście złożonych po
while
,until
,if
,elif
słowa zastrzeżonego, rurociąg poczynając!
zarezerwowanym słowem, ani jako część polecenia&&
lub||
listy wyjątkiem ostatniego:Ostatnie niepowodzenie polecenia nadal
set -e
wpływa na:Powłoki w tle nie w poleceniu związku:
źródło
echo "printed"
iecho "not_printed"
w twoich przykładach (zamiastecho 1
).set -e
powoduje wyjście w(false && true); echo not here
, ale nie w{ false && true; }; echo here
, chociaż YMMV z różnymi powłokami, a nawet różnymi wersjami tej samej powłoki. Nieset -e
dotknąłbym tyczką i zamiast tego wykonałbym właściwą obsługę błędów.zgaduję, że warunek „jeśli-to” oceniam jako prawdziwy.
próbowałem
kto daje
kod błędu jest przechwytywany przez warunek, więc bash nie spowoduje zakończenia wykonywania.
źródło
if ... fi