Código de salida al final de un script bash

22

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

Mi pregunta es sobre cuando veo el código de salida 0 al final de un script, ¿fuerza el código de salida como 0 incluso si el script falló o tiene otro significado?

Reventado
fuente
2
Si un script termina con exit 0, saldrá con el código de salida de 0 independientemente de lo que ocurra dentro del script.
Hatclock
@Hatclock, ¿por qué no publicaste tu respuesta como respuesta completa? como comentario, no puedo marcarlo, y no creo que obtengas puntos de Internet falsos por responder (¿verdad?) Solo un pensamiento ... (felicitaciones por la respuesta rápida)
Busted
1
Estoy en una estación de tren en mi teléfono, realmente no me gusta escribir demasiado en mi teléfono. ¡Sin embargo, ilkkachu parece tener una buena respuesta!
Hatclock
Consulte también: ¿ Código de salida predeterminado cuando finaliza el proceso?
Stéphane Chazelas
2
@Hatclock No, en absoluto. Si un script termina con exit 0, saldrá con el código 0 solo si se ejecutó esa última instrucción. El único impacto de exit 0al final del script es devolver 0 en lugar del estado de la instrucción anterior.
Gilles 'SO- deja de ser malvado'

Respuestas:

22

El comando incorporado exitsale del shell (de la referencia de Bash ):

exit [n]
Salga 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 finalice el shell.

La ejecución hasta el final del archivo también sale, devolviendo el código de retorno del último comando, por lo que sí, una final exit 0hará que el script salga con un estado exitoso independientemente del estado de salida de los comandos anteriores. (Es decir, suponiendo que el script llegue al final exit). Al final de un script, también puede usar trueo :para obtener un código de salida de cero.

Por supuesto, más a menudo lo usarías exitdesde adentro ifpara terminar el script en el medio.

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 estoy seguro de si el concepto del script "falla" cuando se ejecuta un exitsentido, ya que es posible que algunos comandos ejecutados por el script fallen, pero el script en sí mismo tenga éxito. Depende del autor del guión 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 códigos superiores a 127 para indicar un proceso terminado por una señal, pero se pueden devolver de la manera habitual. La waitllamada al sistema en realidad devuelve un valor más amplio, y el resto contiene bits de estado establecidos por el sistema operativo.

ilkkachu
fuente
Genial, no sabía sobre la numeración de los códigos de salida de 8 bits. ¡Gracias!
Busted
Tenga en cuenta que cuando se mata un proceso, no sale con un código de salida> 127. Es solo que algunos shells se establecen $?en 128 + signum en ese caso. ¿Ver el código de salida predeterminado cuando finaliza el proceso? para detalles.
Stéphane Chazelas
exit 0solo devolverá 0, si se ejecuta la salida. (podría salir por una ruta diferente).
ctrl-alt-delor
18

0 significa éxito, los enteros positivos significan 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 eliminado por una señal (129 y superior). ¿Ver el código de salida predeterminado cuando finaliza el proceso? y ¿Qué valores de retorno / salida puedo usar en funciones / scripts bash? para 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. Así 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 somecommanddevuelve. Este segundo guión también podría escribirse

#!/bin/sh
somecommand
true

Poner exit 0al final de un script no necesariamente hace 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 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 según su primer argumento:

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

El siguiente script devuelve el estado de somecommand, ya que set -ehace que el script salga si somecommandfalla:

#!/bin/sh
set -e
somecommand
exit 0
Gilles 'SO- deja de ser malvado'
fuente