2010-09-08 8 views
43

Czy są jakieś warianty powłoki (szczególnie bash lub ksh), które testują skrypty powłoki pod względem stylu, najlepszych praktyk, konwencji nazewnictwa itp.? (Coś jak Lint dla C lub Perl :: Critic dla Perla.)Czy istnieje narzędzie do analizy statycznej, takie jak Lint lub Perl :: Critic dla skryptów powłoki?

Wiem, że z ksh możesz wykonywać sprawdzanie składni przez uruchomienie ksh -n script.ksh, ale miałem nadzieję na coś więcej niż tylko sprawdzanie sytax - coś, co analizuje/analizuje rzeczywisty kod?

Prawdopodobnie nie mam szczęścia, ale chyba nie zaszkodzi zapytać.

Odpowiedz

30

Projekty Debianie i Ubuntu użyć skryptu checkbashisms, wygląda dla poszczególnych wzorców, które mogłyby wskazywać, że ktoś powołuje się na /bin/sh będąc bash.

Poza tym, większość powłok ma opcję -n do analizowania i zgłaszania błędów. można sprawdzić swój skrypt na kilku różnych skorup, aby upewnić się, że używa tylko przenośny składnię:

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

zmienił dodać: Ponieważ pisząc tę ​​odpowiedź, shellcheck został napisany, jak sugeruje in a later answer. Jest to o wiele dokładniejsza praca nad skryptami powłoki lintingowej niż poprzednie sugestie.

+0

Fajnie - ten skrypt wygląda obiecująco! Sądząc po moim braku znalezienia czegokolwiek innego i braku odpowiedzi, powiedziałbym, że to prawdopodobnie jedyna rzecz, która robi tego typu rzeczy. Dziękuję bardzo! – BrianH

+1

Czy to ja lub ta opcja nie jest na stronie man bash ani zsh? – log0

+1

'bash -n' jest podobne do' set -n'. – fossilet

37

I found shellcheck: testuje typowe błędy w cytowaniu i inne rzeczy, które przeoczysz ("ponieważ to działa").

+1

To źle, zależy od Haskella. To miłe, ale haskell jest ogromną zależnością. –

+2

@Shurane - zależność jest niezbędna tylko do budowania, a nie do uruchamiania pliku wykonywalnego. –

+2

Wygląda na to, że jedyną zależnością jest przeglądarka. – msanford

7

Napisałem shlint, aby zawijać checkbashim i inne podstawowe opcje lintowania dostępne dla muszli przedstawionych w odpowiedzi Briana.

Można go zainstalować przez rubygems (gem install shlint) jako rodzaj knebla, naprawdę, ale potrzebujesz tylko perla (dla checkbashims) i powłoki zgodnej z POSIX, aby zinterpretować samo polecenie shlint. Powinien działać po wyjęciu z pudełka na OSX i Ubuntu.

Powiązane problemy