GNU/Linux >> Tutoriales Linux >  >> Linux

¿La secuencia de comandos Bash con `set -e` no se detiene en el comando `… &&…`?

Yo uso set -e para detener el script bash en el primer error.

Todo funciona bien a menos que use el 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
$

comparado con:

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

El primer ejemplo todavía hace eco I'm running! , pero el segundo no. ¿Por qué se comportan de manera diferente?

UPD. Pregunta similar:https://stackoverflow.com/questions/6930295/set-e-and-short-tests

Respuesta aceptada:

Este es un comportamiento documentado.
La página man de bash(1) dice, para set -e ,

El shell no sale si el comando que falla
es parte de la lista de comandos
inmediatamente después de un while o until palabra clave,
parte de la prueba que sigue al if o elif palabras reservadas, parte de cualquier comando ejecutado en un && o || lista excepto el comando que sigue al && final o || ,
cualquier comando en una canalización excepto el último,
o si el valor de retorno del comando se invierte con ! .
[Énfasis añadido.]

Y el lenguaje de comandos de shell de POSIX La especificación confirma que este es el comportamiento correcto:

El -e la configuración se ignorará
al ejecutar la lista compuesta
después de while , until ,if , o elif palabra reservada,
una canalización que comienza con ! palabra reservada,
o cualquier comando de una lista AND-OR que no sea el último.

y Sección 2.9.3 Listas de ese documento define

Una lista AND-OR es una secuencia de una o más canalizaciones
separadas por los operadores "&& ” y “|| “.


Linux
  1. En un script Bash, ¿cómo funciona el comando Continuar con bucles incrustados?

  2. ¿El comando Rm en Bash Script no funciona con variables?

  3. ¿No se puede detener un script Bash con Ctrl+c?

  4. Compruebe cuánto tarda en ejecutarse un script de Bash con el comando de tiempo

  5. nombre base con espacios en un script bash?

Automatice el procesamiento de imágenes con este script Bash

Cómo escribir un script Bash con ejemplos

Tutorial de Bash HereDoc con ejemplos

Comando de suspensión de Linux (Pausar un script Bash)

Comando Bash Echo explicado con ejemplos en Linux

Bash Scripting - Comando Printf explicado con ejemplos