Uso de shellcheck para encontrar y corregir errores de secuencias de comandos

Contenidos

Shellcheck es una magnífica herramienta de análisis de secuencias de comandos para el shell de Linux que se puede usar para detectar errores de programación comunes. Shellcheck analiza los scripts e informa sobre errores y advertencias, del mismo modo que lo que haría un compilador.

Que es Shellcheck?

Si ha sido desarrollador de Linux Bash por un tiempo, probablemente haya encontrado una buena cantidad de errores en sus propios scripts o en los scripts de otros. Es probable que la introducción de errores en el código suceda cuando los humanos están desarrollando código. Inclusive los mejores desarrolladores pueden perder de vez en cuando una complejidad imprevista o una advertencia en su código.

En Bash, no hay un compilador real como, a modo de ejemplo, en C ++. A pesar de esto, existe un conjunto de herramientas que pueden ser de gran ayuda al desarrollar scripts Bash. Una vez que tal herramienta es shellcheck. Esta excelente utilidad analizará un archivo de script Bash y hará recomendaciones sustentadas en lo que se encuentre durante su análisis. Es un poco como tener un compilador para Bash.

Herramientas como shellcheck difieren en su funcionamiento de otras herramientas de tiempo de ejecución, como a modo de ejemplo ejecutar un script con bash -x para ver todos y cada uno de los comandos en el script que se están ejecutando, y eso en tiempo real. El motivo es que shellcheck analizará el script (archivo) sin ejecutarlo verdaderamente, de nuevo de manera equivalente a lo que haría un compilador.

Para obtener más información sobre bash -x, es factible que desee leer Bash Automation and Scripting Basics (Parte 3), que forma parte de la serie de 3 partes Bash Automation and Scripting Basics.

Instalando Shellcheck

Instalar Shellcheck en su distribución de Linux basada en Debian / Apt (como Ubuntu y Mint), ejecute el siguiente comando en su terminal:

sudo apt install shellcheck

Instalar Shellcheck en su distribución de Linux basada en RedHat / Yum (como RHEL, Centos y Fedora), ejecute el siguiente comando en su terminal:

sudo yum install shellcheck

Corriendo Shellcheck

Una vez que hayamos instalado shellcheck, podemos hacer una prueba simple con un script roto. Primero definimos nuestro guión test.sh como sigue:

#! / bin / wash echo 'Bash no es wash echo Más errores para mí "si [ -d ./directory }; than
  echo 'sure! < start
fif

How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Shellcheck output 1

Immediately on the first line it finds an issue with the shebang specification. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 article. Our pun shebang line #!/bin/wash should be #!/bin/bash. Let’s fix this. Issue 1/8 fixed!

We will also at the same time fix the other two issues immediately recognized by shellcheck: Did you forget to close this single quoted string? for the second line: spot on! Issue 2/8 fixed. For the third issue there is a little confusion as to our/the developers intent for shellcheck, and this is to be expected, as the ' on line 2 opens a string which is only terminated on line 5 when another ' is seen!

As this third issue is thus a result of the second issue, this run will allow us to fix two issues for the time being. Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Let’s run shellcheck on this again after making the corrections and see what the output is.

Shellcheck output 2

In this instance, shellcheck sees that a " is opened on line 3 (even though it is at the end of the line, it is actually an opening double quote as such), and that even at script end (note the line 8 indication, which does not exist in our 6-line script with a single empty line after the last line. Let’s clean up this empty line, and fix the double quoting issue at the start of line 3, which can now be readily understood. Issue 3/8 fixed!

Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):

Bash shellcheck output 3

Could not be clearer; The mentioned syntax error was in this if expression and Expected test to end here. We shall do as suggested and change the } to ], haciendo que la línea se lea if [ -d ./directory ]; than. ¡Problema 4/8 solucionado! Volvimos a ejecutar shellcheck y ahora se nos presenta lo siguiente:

shellcheck salida 4

Otro problema de comillas simples. Ya sabemos cómo solucionarlos. Cambiemos echo 'sure! < start para echo 'sure!' < start (¡Problema 5/8 solucionado!) y vuelva a ejecutar shellcheck una vez más:

Salida 5 de Shellcheck

Interesante al principio, vemos que shellcheck no puede analizar una línea. Aunque esto puede parecer una deficiencia en shellcheck, leyendo un poco más, vemos que en algún lugar un then Está perdido. ¡Ajá! Hemos puesto than en lugar de then. Qué error tan descuidado 😉 Se solucionó fácilmente (¡problema 6/8 solucionado!). Nuestro script ahora se ve así:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' < start
fif

Y otra ejecución de shellcheck nos proporciona otra información útil:

Salida 6 de Shellcheck

Tenemos una falta fi! Ajá si fif No lo hará. Cambiamos fif para fi en la última línea del script (problema 7/8) se corrigió y ejecutó shellcheck una vez más.

Salida 7 de Shellcheck

Un obstáculo de redirección. Honestamente no esperaba shellcheck para captar además este error, puesto que < además se puede utilizar en Bash, pero seguro que lo hizo. En realidad, nuestra redirección estaba destinada a ser > en lugar de <. Problema 8/8 – ¡todos los problemas – solucionados! Esto nos lleva al guión final.

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' > start
fi

Veamos qué piensa Shellcheck ahora.

Salida de Shellcheck 8

¡Perfecto! Y el guión funciona estupendamente, desde la primera ejecución.

Si revisa el resultado de los múltiples comandos de shellcheck, además notará otra característica muy útil de shellcheck, especialmente para principiantes: se muestra un conjunto de hipervínculos (links a sitios web), en los que se puede hacer un clic con el mouse desde la ventana del terminal, o puede seleccione (si es necesario)> haga clic derecho para copiar y posteriormente pegar en un navegador. Al hacer un clic en dicho link, accederá al proyecto shellcheck GitHub.

¿Escapado?

Si desea verificar rápidamente solo las alternativas más importantes, le sugerimos que eche un vistazo a la --severity={SEVERITY} opción, donde reemplazarías {SEVERITY} con uno de error, warning, info, style.

Por eso, si solo está buscando errores y advertencias, usaría --severity=warning (que incluye niveles superiores, en esta circunstancia solo error) como una opción para shellcheck.

Terminando

Si no hay problemas con la lógica en un script, ejecute shellcheck antes de ejecutar el script y arreglar todos los problemas detectados, se asegurará una ejecución casi perfecta en el primer intento. ¡Inclusive puede utilizar shellcheck en ese desafío de codificación para su próxima entrevista de codificación Bash en vivo! En este post exploramos varios problemas que podrían surgir en los scripts y cómo shellcheck los maneja.

¡Disfruta de scripts sin errores!

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.