Používám set -e
zastavit bash skript při první chybě.
Vše funguje OK, pokud nepoužiji příkaz s &&
:
$ 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
$
ve srovnání s:
$ 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
$
První příklad stále opakuje I'm running!
, ale ten druhý ne. Proč se chovají jinak?
UPD. Podobná otázka:https://stackoverflow.com/questions/6930295/set-e-and-short-tests
Přijatá odpověď:
Toto je zdokumentované chování.
Manuová stránka bash(1) říká, pro set -e
,
Shell se neukončí, pokud je příkaz, který selže
součástí seznamu příkazů
bezprostředně zawhile
nebountil
klíčové slovo,
část testu následující zaif
neboelif
vyhrazená slova, část jakéhokoli příkazu provedeného v&&
nebo||
seznam kromě příkazu následujícího za posledním&&
nebo||
,
jakýkoli příkaz v kanálu kromě posledního,
nebo pokud je návratová hodnota příkazu invertována pomocí!
.
[Zdůraznění přidáno.]
A POSIX Shell Command Language Specifikace potvrzuje, že se jedná o správné chování:
-e
nastavení bude ignorováno
při provádění seznamu sloučenin
powhile
,until
,if
neboelif
vyhrazené slovo,
kanál začínající znakem!
vyhrazené slovo,
nebo jakýkoli příkaz ze seznamu AND-OR jiný než poslední.
a oddíl 2.9.3 Seznamy tohoto dokumentu definuje
Seznam AND-OR je posloupnost jednoho nebo více kanálů
oddělených operátory „&&
“ a „||
“.