2010-09-08 10 views
43

Gibt es Shell-Checker (speziell Bash oder Ksh), die Shell-Skripte auf Stil, Best Practices, Namenskonventionen usw. testen? (Etwas wie Lint für C oder Perl :: Critic für Perl.)Gibt es ein statisches Analyse-Tool wie Lint oder Perl :: Critic für Shell-Skripte?

Ich weiß mit Ksh können Sie Syntaxprüfung durch Ausführen von ksh -n script.ksh tun, aber ich hatte auf etwas mehr als nur Sytax-Prüfung hoffen - etwas, das analysiert/analysiert tatsächlicher Code?

Ich bin wahrscheinlich Pech, aber ich schätze es tut nicht weh zu fragen.

Antwort

30

Die Debian- und Ubuntu-Projekte verwenden ein Skript checkbashisms, das nach bestimmten Mustern sucht, die darauf hinweisen können, dass jemand sich auf /bin/sh als bash verlässt.

Darüber hinaus haben die meisten Shells eine -n Option zum Parsen und Melden von Fehlern. Sie könnten Ihr Skript gegen mehrere verschiedene Shells überprüfen, um sicherzustellen, dass es nur tragbare Syntax verwendet:

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

bearbeiten hinzuzufügen: Da diese Antwort zu schreiben, shellcheck geschrieben wurde, als in a later answer vorgeschlagen. Dies ist eine viel gründlichere Aufgabe, Shell-Skripte zu löschen, als die vorherigen Vorschläge.

+0

Cool - das Skript sieht vielversprechend aus! Und aufgrund meines Mangels, etwas anderes zu finden, und des Mangels an Antworten, würde ich sagen, dass das wahrscheinlich das Einzige ist, was so etwas macht. Vielen Dank! – BrianH

+1

Ist es mir oder diese Option ist nicht in der man-Seite von bash noch zsh? – log0

+1

'bash -n' ist wie' set -n'. – fossilet

37

I found shellcheck: es testet auf häufige Fehler beim Zitieren und andere Dinge, die Sie übersehen ("weil es funktioniert").

+1

Es ist schade, dass es auf Haskell ankommt. Es ist schön, aber Haskell ist eine ziemlich große Abhängigkeit. –

+2

@Shurane - die Abhängigkeit ist nur zum Erstellen, nicht zum Ausführen der ausführbaren Datei erforderlich. –

+2

Es scheint, dass die einzige Abhängigkeit ein Browser ist. – msanford

7

Ich schrieb shlint, um checkbashims und die anderen grundlegenden linting Wahlen zu umhüllen, die in Brians Antwort dargestellt werden.

Es ist installierbar über rubygems (gem install shlint) als eine Art Gag, wirklich, aber Sie brauchen nur Perl (für checkbashims) und eine POSIX-kompatible Shell, um den shlint Befehl selbst zu interpretieren. Sollte auf OSX und Ubuntu funktionieren.