Есть ли инструмент статического анализа, такой как Lint или Perl:: Critic для сценариев оболочки?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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