Apuntes mientras aprendo sobre software y computadoras.

programación

Qué es el estado de salida en Bash

Este apunte es parte de un proyecto más grande, me refiero a la:

“Guía mínima para empezar a programar en Bash”

Pero de todas maneras el texto puede leerse como un apunte independiente sobre dos temas: “estado de salida” y el comando exit.

Estado de salida

Al completar su ejecución, cada comando que utilizo en Bash entrega un estado de salida. En inglés el concepto se llama “exit status”.

Hay muchos estados de salida, los mismos pueden ir entre el número 0 y el 255.

El 0 siempre representa que el comando se ejecutó exitosamente, cualquier otro número indica algún tipo de error o problema.

Por ejemplo, el comando ls tiene tres estados de salida:

 0 OK, 
1 Algún problema menor (ejemplo, no puede acceder a subdirectorios),
2 Algún problema serio (ejemplo, no puede acceder a argumentos de la linea de comandos).

Puedo conocer esos diferentes estados buscando en el manual de bash. En este caso, escribiendo “man ls” en la linea de comandos.

Entonces creo que esto es lo más importante: la variable “$?” me sirve para conocer el estatus de salida del último programa ejecutado.

Por ejemplo si escribo el comando “ls”:

ls
archivo_A
archivo_B

Ejecutar el comando “ls” me da a conocer los archivos en el directorio de trabajo.

Si luego hago:

echo $?
0

Ya que el comando “ls” funcionó correctamente, al invocar la variable “$?” la misma me dice que tuvo un estado de salida de 0.

Pero por ejemplo si hago:

ls -5
ls: invalid option -- '5'

Y si reviso el estado de salida del error:

echo $?
2

El comando ls me devuelve un error, porque no reconoce la opción -5 como argumento.

Al llamar la variable “$?” con el comando echo, puedo ver que el estado de salida fue un 2. Lo que significa que que por su error el comando no pudo revisar el directorio.

¿Para que sirven los estados de salida?

¿Para que me sirve conocer todo esto? Bueno, entre otras cosas esto me sirve para revisar mis propios scripts en la búsqueda de problemas.

Todo esto forma parte de un concepto más grande, que en inglés se conoce como “debugging”. Esto es buscar “busgs” o errores dentro de un código de computadora.

Lo que puedo hacer es pedir estados de salida en distintas partes del código, para entender como cada parte funciona. Según el número que devuelven esos comandos o funciones voy a descubrir errores que no podría encontrar de otra manera.

El comando “exit”

Según el manual de bash:

NAME
exit – cause normal process termination

Manual del comando exit

Este comando da por terminado un proceso.

Puedo poner el comando exit al final de una función o un script para terminarlo. Pero puedo usarlo también para salir de un loop si una condición no se cumple. Y puedo usar “exit” para simplemente cerrar la consola de comandos.

Pero el comando se encuentra en alguna forma asociado al tema de “estado de salida” que revisamos antes.

Es común en la programación de bash escribir el comando “exit 0” para revisar si un script llegó a leerse hasta el final sin problemas. O también escribir “exit 1” para darle un estado de salida de error en alguna parte.

Digamos por ejemplo que tengo el script llamado “test.sh”:

#!/bin/bash

if [[ ! $1 =~ ^[0-9]+$ ]]; then
    echo No es un número
    exit 1
elif [[ $1 -ge 10 ]]; then
    echo el número es mayor que 10
    exit 0
else
    echo el número es menor que 10
    exit 0
fi

Este programa hace dos cosas:

– Revisa si el valor entregado es mayor o menor que 10.

– Revisa si el valor entregado es un número o no lo es.

Digamos que ejecuto el programa de esta forma:

./test.sh 100

Si luego busco el estado de salida, recibo lo siguiente:

echo $?
0

Y ahí encuentro que el estado de salida es el del último comando ejecutado, en este caso “exit 0”.

Por otra parte si ejecuto el programa de esta forma:

./test.sh wd

Recibo un error, porque no se trata de un número.

Si lo reviso con el estado de salida:

echo $?
1

Puedo revisar que en el script yo puse un comando “exit 1” para terminar el programa, con una salida de 1 para saber que en este punto el parámetro ingresado fue erróneo.

De esta forma puedo hacer que un programa todavía más complejo se vuelva más fácil de comprobar, agregando incluso más posibles referencias de errores con el comando “exit”.

Conclusión

Este es un tema complejo, y aprendí mucho escribiendo este apunte.

Pero es bueno recordar que hay mucho más detrás de estos conceptos, y solamente a través de la práctica es posible entender los estados de salida.

Si encontrás algún error en el material o si mi explicación resultó muy confusa, por favor escribime un correo electrónico desde la sección de contacto para que pueda mejorar el sitio.

La seguimos en el próximo apunte.

Leave a Reply