Cómo los Códigos de Salida de Linux te Ayudan a Escribir Scripts Robustos 1

Cómo los Códigos de Salida de Linux te Ayudan a Escribir Scripts Robustos

Los códigos de salida en Linux son cruciales para determinar el éxito o fallo de comandos. Utiliza la variable $? para robustecer tus scripts y controlar su flujo.

Resumen

  • Cada comando de Linux devuelve un código de salida, siendo 0 el que indica éxito y los valores distintos de cero indican fallo.
  • Puedes usar la variable $? para acceder al código de salida y controlar el flujo del programa en scripts.
  • Ten cuidado con los códigos de salida poco convencionales que varían entre comandos, como diff y curl.

Cada comando de Linux mostrará mensajes de error si falla, pero esta información es difícil de confiar. Tus scripts deberían usar códigos de salida para ser lo más robustos posible.

¿Qué son los códigos de salida?

Cuando ejecutas un comando de Linux, puede fallar. Las cosas pueden salir mal por varias razones, pero normalmente verás un mensaje que explica por qué:

El mensaje de error que ves aparece en STDERR, un flujo diferente de STDOUT, lo que te permite aislar errores de la salida esperada. Como usuario, una descripción del error debería ser informativa, pero los scripts y otros procesos automatizados necesitan conocer los errores de manera más confiable.

Junto con los mensajes de error legibles, cada comando también devuelve un código de salida. Este es un número entre 0 y 255 que indica si el comando falló o tuvo éxito. Por defecto, el código de salida está oculto, pero tu shell proporciona acceso a este valor en la variable especial, $?

Ten en cuenta que un valor de 0 indica éxito y un valor distinto de cero significa fallo. Puedes comprobar este valor en la línea de comandos, interrogarlo en un script y usarlo para controlar el flujo de tus programas.

[enlazatom_show_links]

¿Cómo uso los códigos de salida?

En el ejemplo anterior, ls devolvió un código de salida 0 cuando tuvo éxito y un 1 cuando su argumento no era un archivo válido. Esto puede parecer contradictorio, y contradice los lenguajes de programación típicos que tratan 0 como un valor falso y 1 como verdadero. Sin embargo, esta configuración permite un único valor de éxito universal y una amplia gama de valores para representar diferentes tipos de errores.

Además de mostrar manualmente la variable $?, puedes usarla con una declaración condicional if. Si el comando devuelve un código de salida 0, la declaración ejecutará el bloque then asociado. De lo contrario, si existe uno, ejecutará el bloque else. Por ejemplo:

if command; then echo "el comando tuvo éxito"; else echo "el comando falló"; fi

Puedes usar esta estructura en un script de shell, donde es un poco más fácil formatear para la legibilidad:

if command
 then echo "el comando tuvo éxito"
 else echo "el comando falló"
fi

Esto es equivalente a:

command

if [ $? -eq 0 ]
 then echo "el comando tuvo éxito"
 else echo "el comando falló"
fi

La versión más larga usa la sintaxis de corchetes para probar el valor de $?, pero generalmente es más fácil probar el valor directamente, como en el primer caso. Recuerda que $? siempre representa el código de salida del último comando, así que ten cuidado. Podrías sentir la tentación de mostrar el valor de $? para depurar, por ejemplo:

command

echo "el comando devolvió el código de salida:" $?

if [ $? -eq 0 ]
 then echo "el comando tuvo éxito"
 else echo "el comando falló"
fi

Pero, en el momento de la verificación de la condición, $? tendrá el valor del estado de salida de echo, que es casi seguro que sea 0. Para evitar esto, prueba el comando directamente en la condición o almacena el valor de $? en una variable.

¿Qué más hay que saber sobre el estado de salida?

Los códigos de salida son bastante simples, siguiendo el principio de Unix, y esta es parte de su poder. Pero hay algunas trampas y casos excepcionales de los que deberías estar al tanto.

Códigos de salida desde tu shell

Tu shell utilizará códigos de salida incluso cuando el comando que escribas no se ejecute correctamente. Por ejemplo, zsh y bash usan 127 si el comando no se encuentra y 126 si el comando no es ejecutable:

Códigos de salida no convencionales

Algunos comandos flexionan ligeramente las reglas de estado de salida; son realmente solo convenciones, de todos modos. Por ejemplo, diff usa un valor de 0 para significar "sin diferencias," un valor de 1 para significar "diferencias," y un valor de 2 para representar un error:

Esto puede confundir el significado de las condicionales; por ejemplo:

if diff file1 file2; then
 echo estos archivos son los mismos!
fi

El comando curl también es un poco poco intuitivo. Podrías esperar que curl informe un error HTTP, como un 404 para un no existente.

URL, como un código de estado distinto de cero, pero no lo es:

Puedes usar la opción -f (--fail) para hacer que curl se comporte de manera diferente, devolviendo un código de salida de 22 en caso de fallo:

Sin embargo, ten en cuenta que esto no está 100% garantizado y algunos errores HTTP, incluyendo aquellos que requieren autenticación, seguirán devolviendo un código de salida de 0.

Uso del Código de Salida en una Cadena de Comandos

Uno de los mejores atajos de código de salida sucede sin que siquiera necesites pensarlo. Aquí tienes un ejemplo simple:

ls program && ./program && echo éxito || echo fallo épico

Los operadores lógicos && y || te permiten ejecutar más de un comando según el estado de salida de otros. Son similares a los operadores correspondientes en la mayoría de los lenguajes de programación, pero respetan la convención de códigos de salida. El operador && ejecutará el comando de su derecha solo si el comando de su izquierda devuelve un estado de salida de 0. El operador || ejecutará el comando de su derecha solo si el comando de su izquierda falla con un estado distinto de cero.

Un caso muy común ocurre cuando construyes software desde cero, usando esta receta:

./configure && make && make install

Las tres partes de este comando hacen lo siguiente:

  • ./configure ejecuta un script local que inspecciona tu entorno y genera un Makefile.
  • make ejecuta el programa make y construye el software, usando el Makefile.
  • make install copia el ejecutable generado a una ubicación bien conocida como /usr/local/bin.

Si alguna parte de este proceso falla, se detendrá inmediatamente sin intentar lo restante.

Los Comandos true y false

Tu sistema Linux incluye dos comandos curiosos: true y false. Cada uno de estos no hace nada, excepto devolver un código de salida apropiado: 0 y 1 respectivamente:

Pueden no parecer muy útiles, pero estos comandos son prácticos para pruebas y para algunas tareas de scripting en shell. Puedes usar true en una declaración while para crear un bucle infinito:

while true
do
 echo “corriendo hasta que presiones ^c”
 sleep 10
done

También puedes usarlos junto con operadores lógicos para alterar el comportamiento de los comandos. Por ejemplo, puedes detener temporalmente una larga cadena de comandos:

false && (none || of-these && commands || will-run)

O puedes forzar que una cadena de comandos siga ejecutándose, incluso si un comando falla:

cat file-that-may-not-exist | true && echo hecho

Devolviendo un Código de Salida Desde Tus Propios Scripts

Probablemente hayas utilizado el comando exit antes, para salir de tu terminal. Técnicamente, sale de tu shell y esto significa que puedes usarlo para detener un script de shell también. Por defecto, tus scripts saldrán con el mismo código que el último comando:

Pero puedes cambiar el código de salida pasando un parámetro numérico al comando exit:

exit número

Tu script ahora saldrá con el código de estado que proporcionaste, y puedes usar esto para comunicar diferentes condiciones de error desde tu programa a otros.

Una vez que sepas sobre ellos, los comandos de salida son simples de usar. Incluso puedes usarlo sin pensar realmente en ello, pero cuando se trata de scripting, asegúrate de usar los códigos de salida apropiadamente.

Si deseas encontrar artículos similares a Cómo los Códigos de Salida de Linux te Ayudan a Escribir Scripts Robustos, te sugerimos revisar la categoría Linux.

Índice
  1. Resumen
  • ¿Qué son los códigos de salida?
  • ¿Cómo uso los códigos de salida?
  • ¿Qué más hay que saber sobre el estado de salida?
    1. Códigos de salida desde tu shell
    2. Códigos de salida no convencionales
    3. Uso del Código de Salida en una Cadena de Comandos
    4. Los Comandos true y false
    5. Devolviendo un Código de Salida Desde Tus Propios Scripts
  • Deja una respuesta

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

    Subir