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 tiene eco I'm running!
, pero el segundo no. ¿Por qué se comportan de manera diferente?
UPD Pregunta similar: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907
fuente
fuente
cd
comando fallidoset -e
comportamiento es sorprendente.Respuestas:
Este es un comportamiento documentado. La página de manual bash (1) dice, para
set -e
,Y la especificación del lenguaje de comandos de shell POSIX confirma que este es el comportamiento correcto:
y la Sección 2.9.3 Listas de ese documento define
fuente
La
set -e
opción no tiene efecto en algunas situaciones, y este es el comportamiento estándar y portátil en el shell compatible con POSIX.El comando fallido es parte de la tubería:
imprimirá
printed
.Y solo se considera el fracaso de la tubería en sí:
No imprimirá nada.
La instrucción ejecutada fallado en la lista de la siguiente compuesto
while
,until
,if
,elif
palabra reservada, una tubería que comienza con la!
palabra reservada, o cualquier comando como parte de&&
o||
lista excepto el último:El último comando falla todavía
set -e
afecta:La subshell falla en un comando compuesto:
fuente
echo "printed"
yecho "not_printed"
en sus ejemplos (en lugar deecho 1
).set -e
provoca una salida en(false && true); echo not here
, pero no en{ false && true; }; echo here
, aunque YMMV con diferentes shells e incluso diferentes versiones de un mismo shell. No tocaríaset -e
con un poste de barcaza y en su lugar haría un manejo adecuado de los errores.mi suposición es si-entonces la condición en su conjunto se evalúa como verdadera.
Lo intenté
quien da
el código de error es atrapado por la condición if, por lo que bash no activará el final de la ejecución.
fuente
if ... fi