¿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 -ees la única forma en que sé hacer eso.set -esonsleep(albreakser una construcción especial, la secuencia de comandos se cerrará al fallar en la mayoría de los shells, los comandos dentroifo a la izquierda&&no se verán afectadosset -e,n=...podrían fallar sines 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 1oexit 2etc (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 conditionyn. 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 degksuerror 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
exitsale 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
exita 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.
bashtiene una$PIPESTATUSmatriz especial , similar azshla$pipestatusque 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