Sí, se requiere formateo y ayuda enormemente a comprender el código complejo. Sin embargo, para aquellos que a menudo escriben scripts de shell, la doble verificación del formato puede convertirse en una tarea tediosa. ¡Este artículo le mostrará cómo acortar el trabajo usando shfmt!
Qué 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 limitarse a Bash.
Instalación 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: Deberá reiniciar la máquina (o cerrar la sesión y volver a iniciarla) después de ejecutar el primer comando y antes de ejecutar los comandos siguientes.
sudo dnf install snapd sudo snap install snap-store sudo snap install shfmt
En RHEL y Centos, es posible que también deba instalar el El repositorio de EPEL primero.
Usando shfmt
Una vez que se instala el paquete instantáneo, puede comenzar a usar shfmt.
Definimos 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 importante es su formato. Pero también 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 a función en Bash (en lugar de una definición de función) solo debe tener el nombre, no los paréntesis. Es un poco más alto que la definición de función correcta.
Veamos que shfmt
Piénsalo.
shfmt test.sh
Teniendo en cuenta 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 similar. foo
aquí realmente se refiere a func
.
Incluso entonces, el mensaje permanece un poco críptico hasta que nos damos cuenta, mirando la última línea, que lo que realmente está sucediendo es el inicio de una definición de función (y no una llamada de función) porque 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 algo similar aquí func(){ some_command[s]; }
.
¡Bingo! Esto aumenta la funcionalidad del shfmt
a ser una herramienta de verificación / validación de scripts de shell, aunque probablemente no sea tan completa como la que escribimos sobre el uso de shellcheck para encontrar y corregir errores de scripting. Aún así, ¡muy útil!
Arreglemos 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
Corramos de nuevo shfmt
contra el código y obtiene una salida mucho más adecuada y bien formateada:
Genial. Ahora podemos llevar este nivel más allá y señalar un shfmt
que nos gustaría usar 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 espacio adicional donde un comando en la siguiente línea está estrechamente relacionado con el anterior, como un comando continuo, etc. Aunque esto no sucede a menudo. En más de 10 años, he encontrado los dos espacios ideales como proyectos personales y compartidos.
Todos y cada uno de los proyectos tienen que encontrar su sintaxis ideal, pero tenga en cuenta que si está utilizando una tarjeta 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
define como sangría: 0 para tabulaciones (predeterminado),> 0 para el número de espacios): shfmt -i 2 test.sh
que renderizará el script de la siguiente 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
¡Genial! Sin embargo, notamos esto shfmt
no detectó nuestro error intencional: #!/bin/bash__
no es correcto y debe leerse #!/bin/bash
en vez de.
Por lo tanto, todavía hay un caso de uso para usar shellcheck para encontrar errores de script más allá de su uso shfmt
para formatear mejor las secuencias de comandos. Sin embargo, es interesante notar que, en este caso particular, también shellcheck
no se dio cuenta del problema. Esta falla se ha informado al equipo de shellcheck, por lo que puede solucionarse a su debido tiempo.
Si está interesado en aprender más sobre Linux, puede revisar la serie Bash Automation & Scripting Basics, así como Bash Loops: for, while y until Bash Loops: for, while y until y Exporting Variables in Bash: the Why y Cómo artículos.
Terminando
Ser capaz de escribir scripts limpios, bien formateados y sin errores se convierte en un trabajo más fácil cuando se usa una herramienta de formateo de shell como shfmt
y un corrector de errores / errores como shellcheck
. Incluso entonces, como hemos visto, algunas cosas pueden pasar desapercibidas incluso 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 en función de las sangrías seleccionadas. ¡Disfrutar!
Descubre más contenido