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ě zawhilenebountilklíčové slovo,
část testu následující zaifneboelifvyhrazená 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í:
-enastavení bude ignorováno
při provádění seznamu sloučenin
powhile,until,ifneboelifvyhrazené 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 „||“.