GNU/Linux >> Tutoriales Linux >  >> Linux

¿Choque de concha? ¡No, ShellCheck! Encuentra errores en tus scripts.

Escribir buenos guiones es difícil. Está la habilidad obvia de PEBKAC, por supuesto, pero también la magia y la historia antiguas, con convenciones heredadas que van a Plan 9 y FLOW-MATIC, que la mayoría de las personas realmente no entienden o no les importan cuando escriben su software. Entonces, la falta de un crimen y castigo dostoyevskiano en el desarrollo de software también significa que los códigos pueden ser perezosos y escribir como quieran.

Hace un montón de lunas, me encontré con un pequeño programa diseñado para hacer que su script de shell apeste menos. Se llama ShellCheck, está disponible como una consola en línea y también puede instalarlo en prácticamente cualquier distribución y luego integrarlo en sus flujos de trabajo o lo que sea. Intrigado, me puse a explorar.

Fuego en el agujero

Comencé con mi propio script de shell:simWANsim, un programa diseñado para simular la latencia de la red WAN de una manera sencilla y conveniente (sin necesidad de múltiples interfaces, medios en vivo o similares). Este es esencialmente un script BASH, y quería ver qué tan eficiente y elegante es. Por cierto, no es necesario que el script sea ejecutable para evaluarlo.

shellcheck "nombre del script"

Me sorprendió la cantidad de errores y advertencias, pero luego, cuando comencé a leer, muchos de ellos eran en realidad instancias múltiples del mismo tipo de malas prácticas de codificación, repetidas varias veces a lo largo del script. Además, me di cuenta de que los errores tenían sentido, estaban escritos de forma clara y no se trataba simplemente de una tecnopalabra al azar. Sugerencias prácticas y útiles, con ejemplos, sobre cómo corregir sus scripts.

Uno de los errores comunes fue el uso de acentos graves en lugar de la notación $(). También tenía varias otras líneas en el mismo sentido, el uso de let expr, la falta de comillas dobles para evitar la globosidad y la división de palabras, y algunos otros problemas menores como ese.

En simWANsim.sh línea 152:
EGREP=`which egrep`
^-----------^ SC2006:Utilice la notación $(...) en lugar de ` heredado con acento grave. ..`.
^---^ SC2230:que no es estándar. Use el 'comando -v' incorporado en su lugar.

Quiso decir:
EGREP=$(que egrep)

En simWANsim.sh línea 304:
let PRNT=$PRNT+1
^--------------^ SC2219:En lugar de 'let expr', prefiera (( expr )) .

Me impresionó el estudio de caso [sic]. hola hola Había usado opciones que realmente no he manejado, y tampoco tenía un caso genérico para banderas no especificadas. Parece una pequeña sugerencia inteligente. Muy astuto.

En simWANsim.sh, línea 178:
case $flag in
^-- SC2213:getopts especificó -a, pero este 'caso' no lo maneja.
^-- SC2213:getopts especificó -s, pero este 'caso' no lo maneja.
^-- SC2220:No se manejan indicadores no válidos. Agregue un caso *).

Ninguno de estos son cardinales, pero entonces por qué no. Después de todo, si puede hacer que su código sea lo más limpio y elegante posible, elimina la posibilidad de errores de esquina y comportamiento extraño. No me gusta escribir código, pero si lo estás haciendo, es mejor que lo hagas bien.

También probé un script muy genérico para ver qué sucede cuando no hay errores. La herramienta de línea de comandos simplemente sale, sin ningún resultado. Si usa la herramienta en línea, recibirá un mensaje impreso que dice:

$ shellcheck myscript
¡No se detectaron problemas!

Finalmente, puede embellecer su salida, cambiar la verbosidad de la salida, el estilo y los colores del formato, obligar a ShellCheck a trabajar con un dialecto específico de shell (incluidos sh, bash, dash y ksh), mostrar enlaces wiki, que pueden ser útiles para aquellos que buscan para obtener información adicional y recursos sobre sus prácticas de codificación y errores, además de algunas otras opciones. En resumen, es simple, eficaz y elegante.

Conclusión

ShellCheck es una utilidad realmente genial. Normalmente no me importan mucho las cosas de este tipo, pero puedo apreciar la belleza cuando hay algo que encontrar. La herramienta en sí ha sido escrita en Haskell, lo que nos coloca a todos en un plano metafísico completamente diferente, pero no se lo reprocharemos al autor.

Si usa scripts de shell en su entorno, puede considerar darle una oportunidad a ShellCheck. Creo que se sorprenderá, porque debe haber toneladas de pequeños errores heredados en su código, ya que la gente rara vez regresa y arregla cosas viejas, y termina con sobras que ya no tienen sentido ni sirven para ningún propósito. En la era de la hinchazón innecesaria, ser frugal y elegante cuenta. Esta es una manera inteligente de comenzar su dieta de conchas. Y así termina otro artículo.


Linux
  1. Agregar argumentos y opciones a sus scripts de Bash

  2. ¿Matrices asociativas en scripts de Shell?

  3. ¿Bloqueo correcto en scripts de Shell?

  4. ¿Ocultar la contraseña en los scripts de Shell?

  5. ¿Guardar el resultado de Find como una variable en un script de Shell?

Cómo crear scripts de shell

ShellCheck:una utilidad gratuita para encontrar errores en sus scripts de Shell

Bash Beginner Series #1:Cree y ejecute su primer script de Bash Shell

Matrices en scripts de Shell

Shell/Bash Script para encontrar números primos en Linux

Alcance variable para scripts y funciones bash shell en el script