Come usare shfmt per formattare meglio gli script Shell

Contenuti

Bash Shell

sì, la formattazione è necessaria e aiuta molto a comprendere il codice complesso. Nonostante questo, per coloro che scrivono script di shell molte volte, ricontrollare il formato può diventare un compito noioso. Questo post ti mostrerà come abbreviare il lavoro usando shfmt!

Che cos'è shfmt?

Sviluppato da Dustin Krysak, shfmt è un formattatore, Analizzatore e interprete di shell. Il progetto stesso è ospitato su GitHub e ha un chiaro README e un repository chiaramente strutturato. Lo strumento è stato sviluppato in Go ed è compatibile con le shell POSIX, Bash y mksh. Questo rende shfmt un programma veramente universale piuttosto che essere limitato solo a Bash.

installazione shfmt

Installare shfmt sulla tua distribuzione Linux abilitata per snap (come Ubuntu e Mint), esegui il seguente comando nel tuo terminale:

sudo snap install shfmt

Installazione di shfmt con snap

Installare shfmt sulla tua distribuzione Linux basata su RedHat / Yum (come RHEL, Centos e Fedora), esegui i seguenti comandi nel tuo terminale:

Nota: dovrai riavviare la macchina (oppure disconnettiti e accedi di nuovo) dopo aver eseguito il primo comando e prima di eseguire i seguenti comandi.

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

In RHEL e Centos, È possibile che sia necessario installare anche il comando Il repository EPEL prima di tutto.

Utilizzo di shfmt

Una volta installato il pacchetto istantaneo, È possibile iniziare a utilizzare SHFMT.

shfmt: uno strumento compatto per la formattazione di Shell

Definiamo uno script scritto con un formato molto cattivo come test.sh come segue:

#!/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 ()

Esistono diversi problemi con questo script, il più importante è il formato dello stesso. Ma c'è anche un errore / Errore nello script: la chiamata di funzione func Nell'ultima riga è seguito da più parentesi quadre. Una chiamata di funzione in Bash (invece di una definizione di funzione) deve avere solo il nome, non tra parentesi quadre. È un po 'più alto di quanto sia avvenuta la corretta definizione della funzione..

Vediamo cosa shfmt pensa a questo.

shfmt test.sh

Un esempio funzionante di shfmt che fallisce su una chiamata di funzione sbagliata

Anche se l'output sembra un po' criptico, nota che il termine foo (usato qui) e bar (non utilizzato qui ora) sono spesso utilizzati nei circoli IT per indicare / rappresentare qualsiasi lingua o elemento equivalente. foo qui si riferisce davvero a func.

Anche allora, il messaggio rimane un po' criptico finché non ci rendiamo conto, guardando l'ultima riga, che ciò che sta realmente accadendo è l'inizio di una definizione di funzione (e non una chiamata di funzione) perché le due parentesi erano incluse. Questo spiega quindi perché il messaggio ci dice che ci si aspetta qualcos'altro.; deve essere seguito da una dichiarazione. shmft stai cercando qualcosa come func(){ some_command[s]; }.

¡Bingo! Ciò aumenta la funzionalità di shfmt essere uno strumento di verifica / convalida dello script della shell, anche se probabilmente non è così completo come quello che abbiamo scritto sull'uso di shellcheck per trovare e correggere errori di script. Comunque, molto utile!

Abbiamo corretto il nostro errore e ora lo script di input. test.sh dice quanto segue:

#!/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

Corriamo di nuovo shfmt contro il codice e ottieni un output molto più corretto e ben formattato:

Utilizzo di un rientro di due spazi con shfmt utilizzando l'opzione -i

Eccellente. Ora possiamo andare oltre questo livello e dirtelo shfmt vorremmo usare una larghezza di rientro / tab a due spazi invece di un tab pieno. Scrivo sempre codice usando due spazi come larghezza del rientro / tabulazione, e uso uno spazio extra in cui un comando nella riga successiva è strettamente correlato a quello precedente, come un comando continuo, eccetera., anche se non capita spesso. Per più di 10 anni, Ho trovato i due spazi ideali per progetti personali e condivisi.

Ogni progetto deve trovare la propria sintassi ideale, ma nota che se usi una scheda grande (8 spazi) come il formato presentato da shfmt nell'esempio sopra, il tuo codice può diventare più difficile da leggere facilmente.

Imposteremo la larghezza del rientro / tab in due spazi usando il -i opzione (che lui --help impostato come Sanguinamento: 0 per le ciglia (predeterminato),> 0 per il numero di spazi): shfmt -i 2 test.sh che eseguirà il rendering dello script nel modo successivo:

#!/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

Eccellente! Nonostante questo, notiamo che shfmt non mi sono reso conto del nostro errore deliberato: #!/bin/bash__ non è corretto e dovrebbe leggere #!/bin/bash invece di.

Errore shfmt e shellcheck non riuscito

Perché, Esiste ancora un caso d'uso per l'utilizzo di ShellCheck per trovare errori di script contemporaneamente all'utilizzo shfmt per formattare meglio gli script. Nonostante questo, curiosamente, in questa particolare circostanza, inclusivo shellcheck non si rendeva conto del problema. Questa carenza è stata segnalata al team Shellcheck, quindi a tempo debito può essere organizzato.

Se sei interessato a saperne di più su Linux, puoi dare un'occhiata alla serie Bash Automation & Nozioni di base sugli script, così come i Bash Loops: per, mentre y fino a Bash Loops: per, mentre y fino a y Esportazione di variabili in Bash: i post perché e come.

Fine

Essere in grado di scrivere script puliti, ben formattato e senza errori diventa più facile lavorare quando usi uno strumento di formattazione della shell come shfmt e un correttore di bug / errori come shellcheck. Anche allora, come abbiamo visto, alcune cose potrebbero passare inosservate anche fino al momento in cui esegui lo script per la prima volta. shfmt è un'utilità piccola ma efficace che ti aiuterà a formattare i tuoi script e il codice in base ai rientri selezionati. Godere!

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.