Tengo un script de shell Bash que invoca una serie de comandos. Me gustaría que el script de shell salga automáticamente con un valor de retorno de 1 si alguno de los comandos devuelve un valor distinto de cero.
¿Es esto posible sin verificar explícitamente el resultado de cada comando?
p.ej
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
set -e
, también hacerset -u
(oset -eu
).-u
pone fin al comportamiento idiota y de ocultación de errores al que puede acceder a cualquier variable inexistente y obtener un valor en blanco sin diagnóstico.Respuestas:
Agregue esto al comienzo del script:
Esto hará que el shell salga de inmediato si sale un comando simple con un valor de salida distinto de cero. Un comando simple es cualquier comando que no forme parte de una prueba if, while o while, o parte de un && o || lista.
Consulte la página del comando man bash (1) en el comando interno "set" para obtener más detalles.
Personalmente, comienzo casi todos los scripts de shell con "set -e". Es realmente molesto que un guión continúe obstinadamente cuando algo falla en el medio y rompe las suposiciones para el resto del guión.
fuente
bash script.sh
.set -e; tf() { false; }; tf; echo 'still here'
. Incluso sinset -e
dentro del cuerpo detf()
, la ejecución se aborta. Quizás quisiste decir que las subcapasset -e
no heredan , lo cual es cierto.Para agregar a la respuesta aceptada:
Tenga en cuenta que a
set -e
veces no es suficiente, especialmente si tiene tuberías.Por ejemplo, suponga que tiene este script
... que funciona como se esperaba: un error en
configure
aborta la ejecución.Mañana harás un cambio aparentemente trivial:
... y ahora no funciona. Esto se explica aquí , y se proporciona una solución (solo Bash):
fuente
pipefail
que aceptarset -o
!Las declaraciones if en su ejemplo son innecesarias. Solo hazlo así:
Si toma el consejo de Ville Laurikari y lo usa
set -e
para algunos comandos, es posible que deba usar esto:Esto
|| true
hará que la canalización de comandos tenga untrue
valor de retorno, incluso si el comando falla, por lo que la-e
opción no matará el script.fuente
set -e
no está centrado en bash, es compatible incluso en el Bourne Shell original.Si tiene que realizar una limpieza al salir, también puede usar 'trap' con la pseudo-señal ERR. Esto funciona de la misma manera que atrapar INT o cualquier otra señal; bash lanza ERR si algún comando sale con un valor distinto de cero:
O, especialmente si está usando "set -e", podría atrapar EXIT; su trampa se ejecutará cuando el script salga por cualquier motivo, incluido un final normal, interrupciones, una salida causada por la opción -e, etc.
fuente
La
$?
variable rara vez se necesita. El pseudo-idiomacommand; if [ $? -eq 0 ]; then X; fi
siempre debe escribirse comoif command; then X; fi
.Los casos en los que
$?
se requiere es cuando se debe verificar con varios valores:o cuando
$?
necesita ser reutilizado o manipulado de otra manera:fuente
Ejecútelo con
-e
oset -e
en la parte superior.También mira
set -u
.fuente
help set
:-u
trata las referencias a variables no establecidas como errores.set -u
oset -e
no ambos? @lumpynoseUna expresión como
detendrá el procesamiento cuando uno de los comandos regrese con un valor distinto de cero. Por ejemplo, el siguiente comando nunca imprimirá "hecho":
fuente
Debería ser suficiente.
fuente
simplemente agregando otro para referencia ya que había una pregunta adicional a la entrada de Mark Edgars y aquí hay un ejemplo adicional y toca el tema general:
que es lo mismo
cmd || exit errcode
que alguien mostró.p.ej. Quiero asegurarme de que una partición esté desmontada si está montada:
fuente
[[
cmd`]] `no es lo mismo. Es falso si la salida del comando está vacía y verdadera de lo contrario, independientemente del estado de salida del comando.