¿Cómo puedo escribir un script de shell que salga, si una parte falla? Por ejemplo, si falla el siguiente fragmento de código, la secuencia de comandos debería salir.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
fuente
fuente
set -e
. Sin embargo, realmente no se aplica aquí. El OP quiere salir del script después de 5 intentos fallidos de ejecutar el comando.set -e
es la única forma en que sé hacer eso.set -e
sonsleep
(albreak
ser una construcción especial, la secuencia de comandos se cerrará al fallar en la mayoría de los shells, los comandos dentroif
o a la izquierda&&
no se verán afectadosset -e
,n=...
podrían fallar sin
es de solo lectura, pero luego eso también saldría del guiónset -e
), por lo que la interpretación suena bastante improbable. Estoy de acuerdo en que la pregunta está mal redactada.Puede salir de un script en cualquier lugar utilizando la palabra clave
exit
. También puede especificar un código de salida con el fin de indicar a los demás programas que o cómo suspendido el guión, por ejemplo,exit 1
oexit 2
etc (Por convención, el código de salida 0 es para el éxito y el fracaso mayor cosa que no sea 0 significa, sin embargo, también por convención, salida los códigos superiores a 127 están reservados para la terminación anormal (por ejemplo, por una señal)).La construcción genérica para salir en caso de falla es
Con adecuado
failure condition
yn
. Pero en escenarios específicos puede proceder de manera diferente. Ahora, para su caso, interpreto su pregunta de que si alguna de las cinco invocaciones degksu
error falla, entonces quiere decir salir. Una forma es usar una función como estay luego invoque el bucle
try_command
.Hay (más) formas avanzadas o sofisticadas de cómo abordar su pregunta. Sin embargo, la solución anterior es más accesible para los principiantes que, por ejemplo, la solución de Stephane.
fuente
exit
sale del script a menos que se llame en una subshell. Si esa parte de la secuencia de comandos se encuentra en un subnivel, por ejemplo, porque está dentro(...)
o$(...)
o parte de una línea de tubería, entonces sólo saldrá de que subnivel .En ese caso, si desea que el script salga además de la subshell, deberá llamar
exit
a esa subshell para que salga.Por ejemplo, aquí con 2 niveles anidados de subcapas:
Puede volverse más complicado si la subshell es parte de una tubería.
bash
tiene una$PIPESTATUS
matriz especial , similar azsh
la$pipestatus
que puede ayudarte aquí:fuente
Trap realizará una acción al recibir una señal.
Ejecuta esto y deja que salga normalmente. Atrapa la señal 0.
Ejecútelo de nuevo e interrumpa con ^ C. Atrapa tanto la señal 2 como la señal 0.
Un estado de salida distinto de cero quedará atrapado en ERR
fuente