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