Estoy probando diferentes cosas en bash scripting y me encontré con un problema que no puedo obtener una explicación.

Estoy escribiendo intencionalmente un comando incorrecto, para obtener un código de salida diferente de 0, pero de alguna manera parece que todavía obtengo 0.

El código que «estoy ejecutando es:

USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}" 

La salida de mi código es:

id: opción desconocida – s

Intente «id –help» para obtener más información.

Su comando no se pudo ejecutar con el código de salida 0

Su nombre de usuario es

Supongo que de alguna manera, ¿muestra el código de salida del comando echo? Aun así, si el código de salida es 0, ¿por qué ingresa en la instrucción if?

Si ese es el problema, ¿cómo puedo hacer que muestre el código de salida real que debería mostrarse?

Respuesta

En su código, dentro de la instrucción if, el estado de salida que obtiene impreso es el estado de salida de la prueba [[ ${?} -ne 0 ]]. El valor $? es siempre el estado de salida del comando ejecutado más recientemente, y la prueba cuenta como un comando, al menos con respecto a la configuración del valor de $? a su resultado.

Si desea imprimir el estado de salida de id, asígnelo a una variable cuyo valor no cambiará,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Comentarios

  • Este script que no es POSIX no se ejecuta test[[ es parte de la sintaxis ksh y se ejecuta como parte del intérprete, pero no como una función incorporada Sin embargo, parece que esta parte del intérprete restablece el código de salida recordado.
  • Sin embargo, ¿por qué el script ejecuta ambos echo s? para salir después de la primera y no llegar a la segunda.
  • @pericynthion No muestran el código que realmente ejecutaron. La salida que muestran proviene de una versión de su código sin la instrucción exit 1. Probablemente se agregó más tarde.

Deja una respuesta

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