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 “||
“.