Cómo depurar un script Bash Shell en Linux o UNIX

Oct 6, 2021
admin

De mi bolsa de correo:
Escribí un pequeño script hello world. ¿Cómo puedo depurar un script de shell bash que se ejecuta en un sistema Linux o Unix?
Es la pregunta más común que hacen los nuevos sysadmins o usuarios de Linux/UNIX. La depuración de scripts de shell puede ser un trabajo tedioso (léase como no fácil). Hay varias maneras de depurar un script de shell.
Es necesario pasar el argumento -x o -v al shell bash para recorrer cada línea del script.
Cómo depurar un script de shell bash en Linux o Unix
Veamos cómo depurar un script bash que se ejecuta en Linux y Unix utilizando varios métodos.

Opción -x para depurar un script de shell bash

Ejecutar un script de shell con la opción -x.
$ bash -x script-name
$ bash -x domains.sh

Uso del comando incorporado set

El shell bash ofrece opciones de depuración que pueden activarse o desactivarse utilizando el comando set:

  • set -x : Muestra los comandos y sus argumentos a medida que se ejecutan.
  • set -v : Muestra las líneas de entrada del shell a medida que se leen.

Puede usar los dos comandos anteriores en el propio script del shell:

#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands

Puede reemplazar la línea Shebang estándar:
#!/bin/bash
con el siguiente código (para depuración):
#!/bin/bash -xv

Uso de la función inteligente DEBUG

Primero, añade una variable especial llamada _DEBUG. Ponga _DEBUG en ‘on’ cuando necesite depurar un script:
_DEBUG="on"

Ponga la siguiente función al principio del script:

function DEBUG(){ && $@}

Ahora, siempre que necesite depurar, simplemente use la función DEBUG como sigue:
DEBUG echo "File is $filename"
O
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x

Cuando termine de depurar (y antes de pasar su script a producción) ponga _DEBUG en ‘off’. No es necesario borrar las líneas de depuración.
_DEBUG="off" # set to anything but not to 'on'

Script de ejemplo:

#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"

Guarda y cierra el archivo. Ejecuta el script de la siguiente manera:
$ ./script.sh
Salida:

Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5

Ahora pon DEBUG en off (tienes que editar el archivo):
_DEBUG="off"
Ejecuta el script:
$ ./script.sh
Salida:

Found in xyz.txt file2 + 3 = 5

Lo anterior es una técnica simple pero bastante efectiva. También puede tratar de usar DEBUG como un alias en lugar de la función.

Debugging Common Bash Shell Scripting Errors

Bash o sh o ksh da varios mensajes de error en la pantalla y en muchos casos el mensaje de error puede no proporcionar información detallada.

Se omite aplicar el permiso de ejecución en el archivo

Cuando escriba su primer script de shell bash hola mundo, podría terminar recibiendo un error que dice lo siguiente:
bash: ./hello.sh: Permission denied
Establezca el permiso usando el comando chmod:
$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh

Fin de archivo inesperado Error

Si está recibiendo un mensaje de error de Fin de archivo inesperado, abra su archivo de script y y asegúrese de que tiene comillas de apertura y cierre. En este ejemplo, la sentencia echo tiene una comilla de apertura pero no tiene comillas de cierre:

#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote

También asegúrese de comprobar que no faltan paréntesis y llaves ({}):

#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...

Faltan palabras clave como fi, esac, ;;, etc.

Si se omite una palabra clave final como fi o ;; obtendrá un error como «xxx inesperado». Así que asegúrese de que todas las sentencias if y case anidadas terminen con las palabras clave adecuadas. Consulte la página man de bash para conocer los requisitos de sintaxis. En este ejemplo, falta fi:

#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing

Moviendo o editando el script de shell en Windows o en cajas Unix

No cree el script en Linux/Unix y muévalo a Windows. Otro problema es editar el script de shell bash en Windows 10 y mover/subir al servidor Unix. Resultará en un error como comando no encontrado debido al retorno de carro (DOS CR-LF). Usted puede convertir DOS newlines CR-LF al formato de Unix/Linux utilizando la siguiente sintaxis:
dos2unix my-script.sh

Tip 1 – Enviar mensaje de depuración a stderr

El error estándar es el dispositivo de salida de error por defecto, que se utiliza para escribir todos los mensajes de error del sistema. Así que es una buena idea enviar mensajes al dispositivo de error por defecto:

# Write error to stdoutecho "Error:  file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error:  file not found" 1>&2

Consejo 2 – Activar el resaltado de sintaxis cuando se utiliza el editor de texto vim

La mayoría de los editores de texto modernos le permiten establecer la opción de resaltado de sintaxis. Esto es útil para detectar la sintaxis y evitar errores comunes como la apertura o cierre de comillas. Usted puede ver la secuencia de comandos bash en diferentes colores. Esta característica facilita la escritura en las estructuras de un script de shell y los errores de sintaxis son visualmente distintos. El resaltado no afecta al significado del texto en sí mismo; está hecho sólo para ti. En este ejemplo, el resaltado de sintaxis de vim se utiliza para mi script bash:

Cómo depurar un script de shell Bash en Linux o UNIX utilizando la función de resaltado de sintaxis de Vim

Fig.01: Resaltado de la sintaxis del script de shell Bash utilizando el editor de texto vim

Consejo 3 – Utilizar shellcheck para limpiar el script

ShellCheck es una herramienta de análisis estático para scripts de shell. Uno puede usarlo para encontrar errores en sus scripts de shell. Está escrito en Haskell. Puedes encontrar advertencias y sugerencias para los scripts de shell bash/sh con esta herramienta. Veamos cómo instalar y utilizar ShellCheck en un sistema Linux o similar a Unix para mejorar sus scripts de shell, evitar errores y productividad.

Vea también:

  • Vea cómo activar el resaltado de sintaxis en el editor de texto vim.
  • Página man de Bash
  • BASH con depurador y soporte de depuración mejorado y manejo de errores

🐧 Obtenga los últimos tutoriales sobre Linux, Open Source & DevOps a través de la fuente RSS o el boletín semanal de correo electrónico.
🐧 24 comentarios hasta ahora… añadir uno ↓
Categoría Lista de comandos de Unix y Linux
Archivos Gestión cat
Firewall Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04
Utilidades de red dig – host – ip – nmap
OpenVPN CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04
Administrador de paquetes apk – apt
Gestión de procesos bg – chroot – cron – disown – fg – jobs – killall – kill – pidof – pstree – pwdx – time
Búsqueda grep – whereis – which
Información del usuario groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w
WireGuard VPN Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04

Deja una respuesta

Tu dirección de correo electrónico no será publicada.