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
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.
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):
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:
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:
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:
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.
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.
¡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!