Cómo utilizar shfmt para formatear mejor los scripts de Shell

Contenidos

Bash Shell

Sí, el formateo es necesario y ayuda enormemente a comprender el código complejo. A pesar de esto, para aquellos que escriben scripts de shell muchas veces, la doble verificación del formato puede convertirse en una tarea tediosa. ¡Este post le mostrará cómo atajar el trabajo usando shfmt!

Que es shfmt?

Desarrollado por Dustin Krysak, shfmt es un formateador, analizador e intérprete de Shell. El proyecto en sí es alojado en GitHub y tiene un README claro y un repositorio claramente presentado. La herramienta se desarrolló en Go y es compatible con los shells POSIX, Bash y mksh. Esto hace que shfmt sea un programa verdaderamente universal en lugar de estar restringido solo a Bash.

Instalando shfmt

Instalar shfmt en su distribución de Linux habilitada para snap (como Ubuntu y Mint), ejecute el siguiente comando en su terminal:

sudo snap install shfmt

Instalación de shfmt con snap

Instalar shfmt en su distribución de Linux basada en RedHat / Yum (como RHEL, Centos y Fedora), ejecute los siguientes comandos en su terminal:

Nota: tendrá que reiniciar su máquina (o cerrar sesión y volver a iniciar sesión) después de ejecutar el primer comando y antes de ejecutar los siguientes comandos.

sudo dnf install snapd
sudo snap install snap-store
sudo snap install shfmt

En RHEL y Centos, es factible que además deba instalar el El repositorio de EPEL primero.

Usando shfmt

Una vez instalado el paquete instantáneo, puede comenzar a utilizar shfmt.

shfmt: una herramienta compacta para formatear Shell

Definamos un guión escrito y con muy mal formato como test.sh como sigue:

#!/bin/bash__
 echo 'not well formatted line 1'
  echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '            
func() {
  echo 'more unneeded spaces'
              echo 'way out'
 }
func ()

Hay varios problemas con este script, el más destacado es el formato del mismo. Pero además hay un error / error en el script: la llamada a la función func en la última línea va seguida de más corchetes. Una llamada de función en Bash (en lugar de una definición de función) solo debe tener el nombre, no los corchetes. Es un poco más alto que sucedió la definición de función adecuada.

Veamos que shfmt piensa en esto.

shfmt test.sh

Un ejemplo práctico de shfmt con error en la llamada de función incorrecta

Mientras que la salida parece un poco críptica, tenga en cuenta que el término foo (usado aquí) y bar (no se usan aquí ahora) se usan a menudo en círculos de TI para indicar / representar cualquier idioma o elemento equivalente. foo aquí verdaderamente se refiere a func.

Inclusive entonces, el mensaje permanece un poco críptico hasta que nos damos cuenta, mirando la última línea, que lo que verdaderamente está sucediendo es el comienzo de una definición de función (y no una llamada de función) debido a que se incluyeron los dos corchetes. Esto explica entonces por qué el mensaje nos dice que se espera algo más; debe ir seguido de una declaración. shmft está buscando aquí algo como func(){ some_command[s]; }.

¡Bingo! Esto aumenta la funcionalidad de shfmt a ser una herramienta de verificación / validación de scripts de shell, aún cuando probablemente no sea ni mucho menos tan completa como la que escribimos sobre el uso de shellcheck para hallar y corregir errores de scripting. Aún así, ¡muy útil!

Arreglamos nuestro error y ahora el script de entrada. test.sh dice lo siguiente:

#!/bin/bash__
 echo 'not well formatted line 1'
  echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '            
func() {
  echo 'more unneeded spaces'
              echo 'way out'
 }
func

Volvemos a ejecutar shfmt contra el código y recibe una salida mucho más adecuada y bien formateada:

Usando una sangría de dos espacios con shfmt usando la opción -i

Excelente. Ahora podemos llevar este nivel más allá e indicarle shfmt que nos gustaría utilizar un ancho de sangría / tabulación de dos espacios en lugar de una tabulación completa. Siempre escribo código usando dos espacios como ancho de sangría / tabulación, y uso un espacio adicional donde un comando en la próxima línea se relaciona estrechamente con el anterior, como un comando continuo, etc., aún cuando esto no sucede a menudo. Durante más de 10 años, he encontrado que los dos espacios son ideales para proyectos personales y compartidos.

Todos y cada proyecto disponen que hallar su propia sintaxis ideal, pero tenga en cuenta que si utiliza una pestaña grande (8 espacios) como el formato presentado por shfmt en el ejemplo anterior, su código puede volverse más difícil de leer fácilmente.

Estableceremos el ancho de sangría / tabulación en dos espacios usando el -i opción (que el --help establece como sangría: 0 para pestañas (predeterminado),> 0 para el número de espacios): shfmt -i 2 test.sh que renderizará el script de la próxima manera:

#!/bin/bash__
echo 'not well formatted line 1'
echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '
func() {
  echo 'more unneeded spaces'
  echo 'way out'
}
func

¡Excelente! A pesar de esto, notamos que shfmt no se dio cuenta de nuestro error deliberado: #!/bin/bash__ no es correcto y debería leer #!/bin/bash en lugar de.

El error tanto shfmt como shellcheck fallaron

Por eso, aún hay un caso de uso para utilizar shellcheck para hallar errores de script al mismo tiempo de utilizar shfmt para formatear mejor las secuencias de comandos. A pesar de esto, curiosamente, en esta circunstancia particular, inclusive shellcheck no se dio cuenta del problema. Esta deficiencia se informó al equipo de shellcheck, por lo que a su debido tiempo se puede arreglar.

Si está interesado en aprender más sobre Linux, puede revisar la serie Bash Automation & Scripting Basics, así como los Bash Loops: for, while y until Bash Loops: for, while y until y Exporting Variables in Bash: the Posts por qué y cómo.

Terminando

Ser capaz de escribir scripts limpios, bien formateados y sin errores se convierte en un trabajo más fácil cuando utiliza una herramienta de formateo de shell como shfmt y un comprobador de errores / errores como shellcheck. Inclusive entonces, como vimos, algunas cosas pueden pasar desapercibidas inclusive hasta el momento en que ejecuta el script por primera vez. shfmt es una pequeña pero eficaz utilidad que le ayudará a formatear sus scripts y código de acuerdo con las sangrías seleccionadas. ¡Disfrutar!

Suscribite a nuestro Newsletter

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