Me preguntaba cuál sería la mejor manera de verificar el estado de salida en una declaración if para hacer eco de una salida específica.
Estoy pensando en que sea
if [ $? -eq 1 ]
then
echo "blah blah blah"
fi
El problema que también tengo es que la declaración de salida es anterior a la declaración if simplemente porque tiene que tener ese código de salida. Además, sé que estoy haciendo algo mal ya que la salida obviamente saldría del programa.
bash
shell
if-statement
error-handling
deadcell4
fuente
fuente
some_program; rc=$?; if [ ${rc} -eq 1 ] .... fi ; exit ${rc}
Respuestas:
Cada comando que se ejecuta tiene un estado de salida.
Esa verificación está mirando el estado de salida del comando que terminó más recientemente antes de que se ejecute esa línea.
Si desea que su secuencia de comandos salga cuando esa prueba devuelva verdadero (el comando anterior falló), entonces ponga
exit 1
(o lo que sea) dentro de eseif
bloque después deecho
.Dicho esto, si está ejecutando el comando y desea probar su salida utilizando lo siguiente, a menudo es más sencillo.
O para cambiar eso, usarlo
!
para la negaciónSin embargo, tenga en cuenta que a ninguno de esos le importa cuál es el código de error. Si sabe que solo le importa un código de error específico, entonces debe verificarlo
$?
manualmente.fuente
a_command || return 1
return
solo funciona en una función y un script de fuente. Necesitaexit
para el otro caso (que hace demasiado en una función y un script de origen). Pero sí, ese es ciertamente un patrón razonable si no necesita ninguna limpieza específica o salida adicional.dash
, el shell predeterminado no interactivo en muchas distribuciones modernas de Linux, no se preocupa por la distinción entrereturn
yexit
dentro de los scripts de shell ejecutados.dash
sale del script incluso si lo usoreturn
en él.if <command>
pasa si el código de salida es 0. En cualquier otro idioma sería al revésif ! some_command | some_other_command
ignorará el estado de some_command. Las dos soluciones alternativas de comando sonset -o pipefail
(puede cambiar la funcionalidad en otras partes de su programa) o mover laif
declaraciónif [[ ${PIPESTATUS[0]} -ne 0 ]]
como un comando de seguimiento separado (feo, pero funcional). Si está utilizando,set -e
entonces también querrá agregar|| true
al final de la tubería cuando use la segunda solución, ya que eliminar la tubería del flujo de control ofrecido porif
lo contrario provocaría que salga inmediatamente.Tenga en cuenta que los códigos de salida! = 0 se utilizan para informar un error. Entonces, es mejor hacer:
en vez de
fuente
dnf check-update
devuelve 0 (sin actualizaciones), 100 (actualizaciones disponibles) o 1 (error).dnf
desarrolladores han elegido de esta manera, es su elección. Pero aún así, su elección no hace que la especificación se rompa :)$?
es un parámetro como cualquier otro. Puede guardar su valor para usar antes de llamar en última instanciaexit
.fuente
Alternativa a la
if
declaración explícitaMínimamente:
test $? -eq 0 || echo "something bad happened"
Completar:
fuente
Solo para agregar a la útil y detallada respuesta :
Si tiene que verificar el código de salida explícitamente, es mejor usar el operador aritmético
(( ... ))
, de esta manera:O use una
case
declaración:Respuesta relacionada sobre el manejo de errores en Bash:
fuente