GNU/Linux >> Znalost Linux >  >> Linux

Bash skript s `set -e` se nezastaví při příkazu `… &&…`?

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ě za while nebo until klíčové slovo,
část testu následující za if nebo elif 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
po while , until ,if nebo elif 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 „|| “.


Linux
  1. Předat argumenty příkazového řádku skriptu Bash?

  2. Ve skriptu Bash Jak funguje příkaz Continue s vestavěnými smyčkami?

  3. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  1. Nelze zastavit Bash skript pomocí Ctrl+c?

  2. Ubuntu - Spusťte příkaz při spuštění pomocí sudo

  3. Spusťte příkaz bash na jenkins pipeline

  1. Zkontrolujte, jak dlouho trvá spuštění Bash skriptu s Time Command

  2. Je možné, aby skript bash shell interagoval s jiným programem příkazového řádku?

  3. základní jméno s mezerami ve skriptu bash?