Cómo usar shfmt para formatear mejor los scripts de shell

Bash Shell

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!

→ Índice de contenidos

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

Instalación de snap 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.

shfmt: una herramienta de formato de shell compacta

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

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

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:

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

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.

El error falta tanto en shfmt como en shellcheck

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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir Change privacy settings