Código de salida al final de un script bash

Estoy confundido sobre el significado del código de salida al final de un script bash: conozco ese código de salida 0 significa que finalizó correctamente y que hay muchos más números de códigos de salida (127 si no me equivoco)

Mi pregunta es acerca de cuándo ver el código de salida 0 al final de un script, ¿ ¿fuerza el código de salida como 0 incluso si la secuencia de comandos falla o tiene otro significado?

Comentarios

  • Si una secuencia de comandos termina con exit 0, saldrá con el código de salida 0 independientemente de lo que suceda dentro del script.
  • @Hatclock por qué no ' ¿No publicas tu respuesta como una respuesta comprometida completa? Como comentario, no puedo marcarlo, y no ' creo que obtienes puntos de Internet falsos por responder (¿verdad?) Solo una idea. .. (felicitaciones por la respuesta rápida)
  • Yo ' estoy en una estación de tren en mi teléfono, no Realmente no me gusta escribir demasiado en mi teléfono. ¡ilkkachu parece tener una buena respuesta!
  • @Hatclock No, en absoluto. Si un script termina con exit 0, saldrá con el código 0 solo si se ejecutó la última instrucción. El único impacto de exit 0 al final de la secuencia de comandos es devolver 0 en lugar del estado de la instrucción anterior.
  • @Gilles Eso fue más ambiguo respuesta redactada de mi parte. Si un script ejecuta exit 0 en cualquier momento, devolverá el código de salida 0 independientemente de lo que haya sucedido antes de eso.

Respuesta

El comando integrado exit sale del shell (desde Bash «s referencia ):

exit [n]
Salir del shell, devolviendo un estado de n al padre del shell. Si se omite n, el estado de salida es el del último comando ejecutado. Cualquier trampa en EXIT se ejecuta antes de que termine el shell.

La ejecución hasta el final del archivo también sale, devolviendo el código de retorno del último comando, así que sí, un exit 0 final hará que el script salga con un estado exitoso independientemente del estado de salida de los comandos anteriores (es decir, asumiendo que el script alcanza el exit final). Al final de un script, también puede usar true o para obtener un código de salida de cero.

Por supuesto, más a menudo» usaría exit desde dentro de un if para terminar el script en el medio.

Estos deben imprimir un 1 ($? contiene el código de salida devuelto por el comando anterior) :

sh -c "false" ; echo $? sh -c "false; exit" ; echo $? 

Si bien esto debería imprimir un 0:

sh -c "false; exit 0" ; echo $? 

No seguro si el concepto de que el script «falla» al ejecutar un exit tiene sentido, ya que es muy posible que algunos comandos ejecutados por el script fallen, pero que el script en sí tenga éxito . Depende del autor del script decidir qué es un éxito y qué no.

Además, el rango estándar para los códigos de salida es 0..255. El shell utiliza los códigos superiores a 127 para indicar un proceso terminado por una señal, pero se pueden devolver de la forma habitual. La llamada al sistema wait en realidad devuelve un valor más amplio, y el resto contiene bits de estado establecidos por el sistema operativo.

Comentarios

  • Genial, yo ' no sabía acerca de la numeración de los códigos de salida de 8 bits. ¡Gracias!
  • Tenga en cuenta que cuando se mata un proceso, no sale con un código de salida > 127. Es ' s solo que algunos shells establecen $? en 128 + signum en ese caso. Consulte ¿Código de salida predeterminado cuando finaliza el proceso? para obtener más detalles.
  • exit 0 solo devolverá 0, si se ejecuta la salida. (podría salir por una ruta diferente).

Respuesta

0 significa éxito, enteros positivos significa fracaso. Hay 255 códigos de error diferentes, pero los valores 126 y superiores están reservados para indicar que un programa no pudo iniciarse (126 o 127) o fue cancelado por una señal (129 y superior). Consulte ¿Código de salida predeterminado cuando se termina el proceso? y ¿Qué valores de retorno / salida puedo usar en funciones / scripts de bash? para obtener más información.

El estado de salida de un script de shell es el estado de salida del último comando que ejecutó el script. Por ejemplo,

#!/bin/sh somecommand 

devuelve el estado de salida de somecommand, mientras que

#!/bin/sh somecommand exit 0 

devuelve 0 independientemente de lo que somecommand regresó.Este segundo script también se podría escribir

#!/bin/sh somecommand true 

Poner exit 0 al final de un script no necesariamente causa que devuelva 0. Esto solo hace que devuelva 0 cuando se alcanza el final del script. Por ejemplo, el siguiente script siempre devuelve 3:

#!/bin/sh exit 3 exit 0 

El El siguiente script también siempre devuelve un código de error, además de mostrar un mensaje sobre un error de sintaxis:

#!/bin/sh } exit 0 

El siguiente script devuelve 1 o 0 dependiendo de su primer argumento:

#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0 

El siguiente script devuelve el estado de somecommand, desde set -e hace que la secuencia de comandos se cierre si somecommand falla:

#!/bin/sh set -e somecommand exit 0 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *