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