2010-09-08 17 views
43

Esistono controllori di shell (in particolare bash o ksh) che testano gli script di shell per stile, best practice, convenzioni di denominazione, ecc.? (Qualcosa come Lint for C, o Perl :: Critic for Perl.)Esiste uno strumento di analisi statico come Lint o Perl :: Critic per gli script di shell?

So che con ksh è possibile eseguire il controllo della sintassi eseguendo ksh -n script.ksh ma speravo in qualcosa di più del semplice controllo della sintassi - qualcosa che analizza/analizza il codice attuale?

Probabilmente sono sfortunato, ma immagino che non gli faccia male chiedere.

risposta

30

I progetti Debian e Ubuntu utilizzano uno script checkbashisms, che cerca modelli particolari che potrebbero indicare che qualcuno si affida a /bin/shbash.

Oltre a ciò, la maggior parte delle shell ha un'opzione -n per analizzare e segnalare errori. Si potrebbe verificare lo script nei confronti di diverse conchiglie differenti per assicurarsi che usa la sintassi solo portatile:

for shell in zsh ksh bash dash sh 
do 
    echo "Testing ${shell}" 
    ${shell} -n my_script.sh 
done 

modifica per aggiungere: Dopo aver scritto questa risposta, shellcheck è stato scritto, come suggerito in a later answer. Questo fa un lavoro molto più approfondito di linting degli script di shell rispetto ai suggerimenti precedenti.

+0

Cool - quella sceneggiatura sembra promettente! E a giudicare dalla mia mancanza di trovare qualcos'altro, e dalla mancanza di risposte, direi che probabilmente è l'unica cosa là fuori che fa questo tipo di cose. Grazie mille! – BrianH

+1

Sono io o questa opzione non si trova nella pagina man di bash né di zsh? – log0

+1

'bash -n' è come' set -n'. – fossilet

37

I found shellcheck: verifica gli errori comuni nelle quotazioni e altre cose che si ignorano ("perché funziona").

+1

È troppo male dipende da Haskell. È carino, ma haskell è una dipendenza enorme. –

+2

@Shurane: la dipendenza è necessaria solo per la creazione, non per l'esecuzione dell'eseguibile. –

+2

Sembra che l'unica dipendenza sia un browser. – msanford

7

Ho scritto shlint per avvolgere checkbashims e le altre opzioni di base per lo sfilacciamento disponibili per le shell presentate nella risposta di Brian.

È installabile tramite rubygems (gem install shlint) come una sorta di gag, in realtà, ma è necessario solo perl (per i checkbashims) e una shell conforme a POSIX per interpretare il comando shlint stesso. Dovrebbe funzionare senza problemi su OSX e Ubuntu.

Problemi correlati