GNU/Linux >> Linux Esercitazione >  >> Linux

Lo script Bash con `set -e` non si ferma al comando `… &&…`?

Uso set -e per interrompere lo script bash al primo errore.

Tutto funziona bene a meno che non utilizzi il comando con && :

$ 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
$

rispetto a:

$ 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
$

Il primo esempio fa ancora eco a I'm running! , ma il secondo no. Perché si comportano diversamente?

UPD. Domanda simile:https://stackoverflow.com/questions/6930295/set-e-and-short-tests

Risposta accettata:

Questo è un comportamento documentato.
La pagina man bash(1) dice, per set -e ,

La shell non esce se il comando che non riesce
fa parte dell'elenco dei comandi
immediatamente dopo un while o until parola chiave,
parte del test dopo il if o elif parole riservate, parte di qualsiasi comando eseguito in un && o || elenco tranne il comando che segue il && finale o || ,
qualsiasi comando in una pipeline tranne l'ultimo,
o se il valore restituito del comando viene invertito con ! .
[Evidenziazione aggiunta.]

E il Shell Command Language POSIX La specifica conferma che questo è il comportamento corretto:

Il -e l'impostazione deve essere ignorata
durante l'esecuzione dell'elenco composto
seguendo il while , until ,if o elif parola riservata,
una pipeline che inizia con il ! parola riservata,
o qualsiasi comando di un elenco AND-OR diverso dall'ultimo.

e Sezione 2.9.3 Elenchi di quel documento definisce

Un elenco AND-OR è una sequenza di una o più pipeline
separate dagli operatori “&& ” e “|| “.


Linux
  1. Passare gli argomenti della riga di comando allo script Bash?

  2. Il comando Rm nello script Bash non funziona con la variabile?

  3. Impossibile interrompere uno script Bash con Ctrl+c?

  4. basename con spazi in uno script bash?

  5. Ubuntu - Esegui il comando all'avvio con sudo

Automatizza l'elaborazione delle immagini con questo script Bash

Come scrivere uno script Bash con esempi

Bash HereDoc Tutorial con esempi

Comando di sospensione di Linux (pausa di uno script Bash)

Comando Bash Echo spiegato con esempi in Linux

Scripting Bash – Spiegazione del comando Printf con esempi