2010-09-08 2 views
43

Есть ли какие-либо оболочки (в частности, bash или ksh), которые проверяют сценарии оболочки для стиля, лучших практик, соглашений об именах и т. Д.? (Что-то вроде Lint для C или Perl :: Critic for Perl.)Есть ли инструмент статического анализа, такой как Lint или Perl :: Критик для сценариев оболочки?

Я знаю, что с помощью ksh вы можете выполнять синтаксическую проверку, запустив ksh -n script.ksh, но я надеялся на что-то большее, чем просто проверка sytax - что-то, что анализирует/анализирует фактический код?

Мне, вероятно, не повезло, но я думаю, это не помешает спросить.

ответ

30

Проекты Debian и Ubuntu используют сценарий checkbashisms, который ищет определенные шаблоны, которые могут указывать на то, что кто-то полагается на /bin/sh, являющийся bash.

Кроме того, большинство снарядов имеют параметр -n для синтаксического анализа и сообщения об ошибках. Вы можете проверить свой скрипт на нескольких различных оболочек, чтобы убедиться, что он использует только портативный синтаксис:

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

редактировать добавить: С момента написания этого ответа, shellcheck было написано, как это было предложено in a later answer. Это делает гораздо более тщательную работу по перетасовке shell-скриптов, чем предыдущие предложения.

+0

Прохладный - этот сценарий выглядит многообещающим! И, судя по отсутствию чего-либо другого и отсутствию ответов, я бы сказал, что это, вероятно, единственное, что есть в этом. Огромное спасибо! – BrianH

+1

Это я или этот вариант не находится на странице руководства bash или zsh? – log0

+1

'bash -n' как' set -n'. – fossilet

37

I found shellcheck: он проверяет распространенные ошибки в цитировании и другие вещи, которые вы пропускаете («потому что он работает»).

+1

Слишком плохо, что это зависит от Хаскелла. Это хорошо, но haskell - это своего рода огромная зависимость. –

+2

@Shurane - зависимость нужна только для построения, а не для запуска исполняемого файла. –

+2

Похоже, что единственная зависимость - это браузер. – msanford

7

Я написал shlint, чтобы обернуть контрольные шашки и другие основные варианты линзы, доступные для снарядов, представленные в ответе Брайана.

Его можно установить с помощью rubygems (gem install shlint) в качестве своего рода кляпа, но вам нужен только perl (для checkbashims) и оболочка, совместимая с POSIX, для интерпретации самой команды shlint. Должен работать из коробки на OSX и Ubuntu.