Manejo de Errores y Códigos de Salida en Bash
Escribir scripts de Bash robustos significa que no solo hagan lo que se supone que deben hacer, sino que también reaccionen inteligentemente cuando algo no sale como se espera. Aquí es donde entran en juego los códigos de salida y cómo Bash te permite usarlos para controlar el flujo de tu script.
El Código de Salida ($?
)
Cada comando o función que ejecutas en Bash devuelve un código de salida (también conocido como exit status o exit code). Este es un número entero entre 0 y 255 que indica el resultado de la ejecución del comando.
0
(Cero): Convencionalmente significa Éxito. El comando se ejecutó sin problemas.- Cualquier otro valor (1-255): Convencionalmente significa Error. Indica que algo salió mal. El número específico puede dar pistas sobre el tipo de error, aunque esto depende del comando.
Puedes acceder al código de salida del último comando ejecutado utilizando la variable especial $?
.
#!/bin/bash
# Ejemplo 1: Comando exitoso
ls /home/ # Esto probablemente funcionará y listará el directorio /home
echo "Código de salida de 'ls /home/': $?" # Salida: 0
# Ejemplo 2: Comando fallido
ls /ruta/que/no/existe/ # Esto fallará porque el directorio no existe
echo "Código de salida de 'ls /ruta/que/no/existe/': $?" # Salida: (un número distinto de 0, p.ej., 2)
# Ejemplo 3: Usando 'true' y 'false' (comandos que solo devuelven un código de salida)
true # Este comando siempre devuelve 0
echo "Código de salida de 'true': $?" # Salida: 0
false # Este comando siempre devuelve 1
echo "Código de salida de 'false': $?" # Salida: 1
Control de Flujo con Códigos de Salida
Los códigos de salida son extremadamente útiles en las estructuras condicionales (if
) y en la ejecución condicional de comandos.
Encadenamiento de Comandos (&&
y ||
)
Puedes ejecutar comandos secuencialmente basándose en el éxito o fracaso del comando anterior.
comando1 && comando2
: Ejecutacomando2
solo sicomando1
fue exitoso (código de salida 0).comando1 || comando2
: Ejecutacomando2
solo sicomando1
falló (código de salida distinto de 0).
#!/bin/bash
# Ejemplo: Descargar un archivo y, si tiene éxito, moverlo.
# Si la descarga falla, mostrar un mensaje de error.
ARCHIVO_URL="http://ejemplo.com/archivo.txt" # Cambia esto por una URL real para probar
ARCHIVO_LOCAL="descarga.txt"
# Usamos wget para descargar. Si tiene éxito, renombra el archivo.
# Si wget falla, el echo del error se ejecutará.
wget -q "$ARCHIVO_URL" && mv "$ARCHIVO_URL" "$ARCHIVO_LOCAL" || echo "Error: Falló la descarga o el renombramiento de $ARCHIVO_URL."
# Para ver el comportamiento, puedes probar con una URL que no existe:
# wget -q "http://url.inexistente.xyz/no-existe.txt" && echo "Descargado" || echo "Fallo la descarga."
Condiciones if
con Códigos de Salida
A menudo, querrás un control más detallado. Puedes usar if
para ejecutar bloques de código basados en el éxito o fracaso de un comando.
#!/bin/bash
# Ejemplo: Verificar si un archivo existe antes de intentar leerlo.
ARCHIVO="mi_documento.txt"
# Crear un archivo de prueba para el primer caso
echo "Contenido de prueba." > "$ARCHIVO"
if [ -f "$ARCHIVO" ]; then # -f verifica si es un archivo regular y existe
echo "El archivo '$ARCHIVO' existe. Procediendo a leerlo."
cat "$ARCHIVO"
else
echo "Error: El archivo '$ARCHIVO' no existe o no es un archivo regular."
fi
# Eliminar el archivo de prueba para el segundo caso
rm "$ARCHIVO"
echo "---"
if [ -f "$ARCHIVO" ]; then
echo "El archivo '$ARCHIVO' no existe o no es un archivo regular."
cat "$ARCHIVO"
else
echo "Error: El archivo '$ARCHIVO' no existe o no es un archivo regular."
fi
Note: La condición de un if
en Bash evalúa el código de salida del comando que se ejecuta dentro de sus corchetes [ ]
o [[ ]]
. Si el código de salida es 0, la condición es "verdadera". Si es diferente de 0, la condición es "falsa".