Cómo usar los códigos de salida de Linux para solucionar problemas en tu sistema Linux

Puedes solucionar problemas más rápido con los códigos de salida de Linux

Los códigos de salida, también conocidos como códigos de retorno o estados de salida, son señales numéricas que un programa, comando o script envía de vuelta al sistema operativo (o proceso que lo llama) cuando termina de ejecutarse. No necesitas buscar en archivos de registro potencialmente largos para diagnosticar una falla: un código de salida a menudo proporciona una pista rápida sobre la naturaleza del problema.

La convención universalmente aceptada es que cuando un programa se ejecuta con éxito, devuelve un código de salida de 0. Cualquier otro número, típicamente dentro del rango estándar de 1 a 255, indica que algo salió mal.

La forma más sencilla de verificar el código de salida del último comando en primer plano ejecutado en shells similares a Unix (como Bash o Zsh) es inspeccionando la variable especial del shell $?. Por ejemplo, primero ejecuta cualquier comando y luego verifica su código de salida:

ls/nonexistent_directory  
echo$?

Mostrando los códigos de salida del último comando ejecutado

El comando echo $? muestra el código de salida numérico almacenado en la variable $?. Si ves 0, significa que el comando anterior se completó con éxito. Un valor distinto de cero como 1, 2 o 127 indica un error, y el número específico ofrece una pista sobre el tipo de problema: quizás un archivo faltante, un directorio inexistente o permisos insuficientes.

Depurando tu script con códigos de salida

Los códigos de salida son especialmente útiles cuando estás escribiendo scripts de shell. Ayudan a tu script a determinar si algo salió bien o mal, permitiéndole decidir qué hacer a continuación.

Aquí hay un ejemplo simple que copia un archivo a una carpeta de respaldo e informa si la copia fue exitosa:

#!/bin/bash  
# Intenta copiar el archivo  
cp important_file.txt backup/  
  
# Verifica si la copia fue exitosa usando el código de salida ($? contiene el código de salida del último comando)  
if[$?-eq0]; then  
echo"¡Copia de seguridad exitosa!"  
else  
echo"¡La copia de seguridad falló con el código de salida $?"  
exit1# Salir del script con un código de error para indicar que algo salió mal.  
fi

Cuando se ejecuta el comando cp, devuelve un código de salida. Un código de salida de 0 significa que todo salió bien. Si el código no es 0, algo salió mal, y el script imprime un mensaje de error y sale con un código de 1.

Estableciendo tus propios códigos de salida

Además de verificar los códigos de salida de los comandos, puedes definir tus propios códigos de salida para indicar diferentes tipos de errores. Esta práctica hace que tus scripts sean más informativos, permitiendo a cualquier persona que los use entender exactamente qué tipo de problema ocurrió.

Considera este script:

#!/bin/bash  
# Verifica que se proporcione un argumento (nombre de archivo).  
if[-z"$1"]; then  
echo"Uso: $0 "  
exit1# El código de salida 1 indica que no se proporcionó ningún argumento.  
fi  
  
# Verifica si el archivo proporcionado como primer argumento existe.  
if[!-f"$1"]; then  
echo"Error: Archivo no encontrado"  
exit2# El código de salida personalizado 2 indica que el archivo no fue encontrado.  
fi

Si alguien ejecuta tu script y falla, puede consultar el código de salida para determinar el error exacto. En este ejemplo, el código de salida 1 señala que el usuario no proporcionó un argumento requerido, mientras que el código de salida 2 indica explícitamente que el archivo no fue encontrado. Este enfoque estructurado es especialmente útil cuando tu script es parte de un sistema más grande o cuando otro script depende de su salida.

Lista de códigos de salida comunes

Si bien diferentes programas pueden definir sus propios códigos de salida, hay algunos patrones comunes que verás en muchas herramientas de línea de comandos, especialmente en sistemas Linux y similares a Unix. Aquí hay algunos de los más frecuentemente encontrados:

  • 0: ¡Todo está bien! El programa se ejecutó sin problemas.
  • 1: Algo salió mal, pero el error no es específico. Esto es como el código de salida general.
  • 2: Uso indebido de comandos internos del shell. Esto puede ocurrir si usas un comando incorrectamente, como olvidar parámetros requeridos.
  • 126: El comando existe, pero no tienes permiso para ejecutarlo.
  • 127: Comando no encontrado. Esto significa que el comando no existe o no está en la ruta del sistema. Verifica tu ortografía.
  • 128: Argumento de salida inválido. Has usado un número que no tiene sentido como código de salida.
  • 130: Programa terminado por Ctrl + C. Esto sucede cuando detienes manualmente un programa.
  • 137: Condición de falta de memoria (OOM).
  • 255: El programa intentó devolver un código de salida fuera del rango válido.

Algunos programas específicos tienen sus propios códigos de salida únicos. Por ejemplo, grep devuelve 0 cuando encuentra coincidencias, 1 cuando no encuentra coincidencias y 2 cuando hay un error. Además, los desarrolladores pueden técnicamente usar casi cualquier número (generalmente de 0 a 255 en sistemas similares a Unix).

Encadenando comandos según el éxito o el fracaso

Bash también proporciona dos operadores útiles && y || que te permiten encadenar comandos dependiendo de si el anterior tuvo éxito o falló:

  • && (operador AND): Ejecuta el siguiente comando solo si el anterior tuvo éxito (código de salida 0).
  • || (operador OR): Ejecuta el siguiente comando solo si el anterior falló (código de salida distinto de cero).

Por ejemplo, supongamos que deseas crear un directorio y luego cambiarte a él de inmediato. Si la creación del directorio falla o cambiarte a él no funciona, es posible que desees mostrar un mensaje de error:

mkdir new_directory &&cd new_directory ||echo"Falló al crear y acceder al directorio"

Aquí, mkdir new_directory intenta crear la carpeta. Si eso funciona, el código ejecuta inmediatamente cd new_directory. Si alguno de los pasos falla, el operador || se activa e imprime el mensaje de error.

Reflexiones finales

Los códigos de salida pueden parecer un pequeño detalle, pero son parte de lo que hace que las herramientas de línea de comandos sean tan poderosas. Crean un lenguaje común para que los programas se comuniquen sobre el éxito y el fracaso, lo cual es esencial para construir sistemas complejos.

Si eres nuevo en el trabajo con la línea de comandos, comienza por acostumbrarte a verificar echo $? cuando los comandos no se comportan como se espera. Pronto estarás usando códigos de salida en tus propios scripts y apreciando este sistema de comunicación simple pero efectivo.