Shellcheck è un ottimo strumento di analisi degli script di shell Linux che può essere utilizzato per rilevare errori di programmazione comuni. Shellcheck analizza gli script e segnala errori e avvisi, proprio come farebbe un compilatore.
Che cos'è Shellcheck?
Se sei uno sviluppatore Linux Bash da un po', probabilmente hai riscontrato una discreta quantità di bug nei tuoi script o negli script di altri. È probabile che l'introduzione di bug nel codice si verifichi quando gli esseri umani stanno sviluppando il codice. Anche i migliori sviluppatori possono perdere di volta in volta una complessità imprevista o un avvertimento nel loro codice..
in bash, non esiste un vero compilatore come, come esempio, e C ++. Nonostante questo, esiste una serie di strumenti che possono essere di grande aiuto durante lo sviluppo di script bash. Una volta che tale strumento è shellcheck. Questa eccellente utility analizzerà un file di script bash e fornirà consigli in base a ciò che viene trovato durante la sua analisi.. È un po' come avere un compilatore per bash.
Strumenti come shellcheck differiscono nel loro funzionamento da altri strumenti di runtime, ad esempio esegui uno script con bash -x
per vedere ogni singolo comando nello script che viene eseguito, e questo in tempo reale. Il motivo è che shellcheck analizzerà lo script (file) senza eseguirlo effettivamente, di nuovo equivalente a quello che farebbe un compilatore.
Per maggiori informazioni su bash -x
, potresti voler leggere Bash Automation and Scripting Basics (Parte 3), che fa parte della serie di 3 partes Basi di automazione e scripting di Bash.
installazione Shellcheck
Installare Shellcheck sulla tua distribuzione Linux basata su Debian / apt (come Ubuntu e Mint), esegui il seguente comando nel tuo terminale:
sudo apt install shellcheck
Installare Shellcheck sulla tua distribuzione Linux basata su RedHat / Yum (come RHEL, Centos e Fedora), esegui il seguente comando nel tuo terminale:
sudo yum install shellcheck
Di fretta Shellcheck
Una volta installato shellcheck, possiamo fare un semplice test con uno script rotto. Per prima cosa definiamo il nostro script test.sh
come segue:
#! / bidone / wash echo 'Bash no es wash echo Más errores para mí "e [ -d ./directory }; than echo 'sure! < start fif
How many bugs can you find? (Tip: there are 8!).
Let’s next see what shellcheck makes of this code:
shellcheck test.sh
Immediately on the first line it finds an issue with the shebang specificazione. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 articolo. Our pun shebang line #!/bin/wash
should be #!/bin/bash
. Let’s fix this. Issue 1/8 fixed!
Allo stesso tempo risolveremo anche gli altri due problemi immediatamente riconosciuti da shellcheck: Hai dimenticato di chiudere questa singola stringa tra virgolette?? per la seconda riga: a posto! Issue 2/8 fixed. Per il terzo numero c'è un po' di confusione riguardo all'intento dei nostri/degli sviluppatori di eseguire il shellcheck, e questo è prevedibile, come la '
in linea 2 apre una stringa che termina solo in linea 5 quando un altro '
è visto!
Poiché questo terzo problema è così un risultato di il secondo problema, questa corsa ci permetterà di risolvere due problemi per il momento. Il nostro script ora assomiglia a questo:
#!/bin/bash echo 'Bash is not wash' echo More errors for me" Se [ -d ./directory }; than echo 'sure! < start fif
Eseguiamo nuovamente shellcheck su questo dopo aver apportato le correzioni e vediamo qual è l'output.
In questo caso, shellcheck vede che a "
è aperto on line 3 (anche se è alla fine della linea, in realtà è un apertura doppia virgoletta come tale), e che anche alla fine del copione (nota la linea 8 indicazione, che non esiste nel nostro script a 6 righe con una singola riga vuota dopo l'ultima riga. Ripuliamo questa riga vuota, e risolvi il problema delle doppie virgolette all'inizio della riga 3, che ora può essere facilmente compreso. Issue 3/8 fixed!
Il nostro script ora assomiglia a questo:
#!/bin/bash echo 'Bash is not wash' echo "More errors for me" Se [ -d ./directory }; than echo 'sure! < start fif
Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):
Could not be clearer; The mentioned syntax error was in this if expression e Expected test to end here. We shall do as suggested and change the }
to ]
, haciendo que la línea se lea if [ -d ./directory ]; than
. ¡Problema 4/8 solucionado! Volvimos a ejecutar shellcheck y ahora se nos presenta lo siguiente:
Otro problema de comillas simples. Ya sabemos cómo solucionarlos. Cambiemos echo 'sure! < start
per echo 'sure!' < start
(¡Problema 5/8 solucionado!) y vuelva a ejecutar shellcheck una vez más:
Interesante al principio, vemos que shellcheck no puede analizar una línea. Aunque esto puede parecer una deficiencia en shellcheck, leyendo un poco más, vemos que en algún lugar un then
Está perdido. Cane! Hemos puesto than
invece di then
. Qué error tan descuidado 😉 Se solucionó fácilmente (¡problema 6/8 solucionado!). Nuestro script ahora se ve así:
#!/bin/bash echo 'Bash is not wash' echo "More errors for me" Se [ -d ./directory ]; then echo 'sure!' < start fif
Y otra ejecución de shellcheck nos proporciona otra información útil:
Tenemos una falta fi
! Ajá si fif
No lo hará. Cambiamos fif
per fi
en la última línea del script (problema 7/8) se corrigió y ejecutó shellcheck una vez más.
Un obstáculo de redirección. Honestamente no esperaba shellcheck
para captar además este error, da <
además se puede utilizar en Bash, pero seguro que lo hizo. In realtà, nuestra redirección estaba destinada a ser >
invece di <
. Problema 8/8 – ¡todos los problemas – solucionados! Esto nos lleva al guión final.
#!/bin/bash echo 'Bash is not wash' echo "More errors for me" Se [ -d ./directory ]; then echo 'sure!' > start fi
Veamos qué piensa Shellcheck ahora.
¡Perfecto! Y el guión funciona estupendamente, desde la primera ejecución.
Se controlli l'output di più comandi shellcheck, noterai anche un'altra caratteristica molto utile di shellcheck, soprattutto per i principianti: viene visualizzato un insieme di collegamenti ipertestuali (link a siti web), che può essere cliccato con il mouse dalla finestra del terminale, oppure puoi selezionare (se richiesto)> fare clic con il tasto destro per copiare e successivamente incollare in un browser. Cliccando su detto link, accederà al proyecto shellcheck GitHub.
sono scappato?
Se vuoi controllare rapidamente solo le alternative più importanti, ti suggeriamo di dare un'occhiata al --severity={SEVERITY}
opzione, dove vorresti sostituire? {SEVERITY}
con uno di error, warning, info, style
.
Perché, se stai solo cercando errori e avvisi, userebbe --severity=warning
(compresi i livelli superiori, solo in questa circostanza error
) come opzione per shellcheck
.
Fine
Se non ci sono problemi con la logica in uno script, correre shellcheck
prima di eseguire lo script e correggere tutti i problemi rilevati, un'esecuzione quasi perfetta sarà assicurata al primo tentativo. Puoi persino usare shellcheck su quella sfida di codifica per la tua prossima intervista di programmazione live bash!! In questo post esploriamo vari problemi che potrebbero sorgere negli script e come shellcheck
li gestisce.
Goditi script senza errori!