Поиск по сайту:

Использование shellcheck для поиска и исправления ошибок сценариев


Shellcheck — отличный инструмент анализа сценариев для оболочки Linux, который можно использовать для обнаружения распространенных ошибок программирования. Shellcheck анализирует скрипты и сообщает об ошибках и предупреждениях подобно тому, что делает компилятор.

Что такое шеллчек?

Если вы какое-то время были разработчиком Linux Bash, вы, вероятно, нашли большое количество ошибок в своих или чужих сценариях. Внесение ошибок в код обязательно произойдет, когда люди разрабатывают код. Даже лучшие разработчики могут время от времени упускать непредвиденные сложности или оговорки в своем коде.

В Bash нет настоящего компилятора, как, например, в C++. Однако существует набор инструментов, которые могут сильно помочь при разработке сценариев Bash. Одним из таких инструментов является shellcheck. Эта замечательная утилита проанализирует файл сценария Bash и даст рекомендации на основе того, что будет найдено во время его анализа. Это немного похоже на наличие компилятора для Bash.

Такие инструменты, как shellcheck, отличаются по своей работе от других инструментов среды выполнения, таких как, например, выполнение сценария с помощью bash -x, чтобы увидеть каждую команду в выполняемом сценарии в режиме реального времени. Причина в том, что shellcheck будет анализировать скрипт (файл), фактически не выполняя его, опять же аналогично тому, что сделал бы компилятор.

Для получения дополнительной информации о bash -x вы можете прочитать Bash Automation and Scripting Basics (Part 3), которая является частью серии статей Bash Automation and Scripting Basics 3.

Установка шеллчека

Чтобы установить shellcheck в свой дистрибутив Linux на основе Debian/Apt (например, Ubuntu и Mint), выполните следующую команду в своем терминале:

sudo apt установить шеллчек

Чтобы установить shellcheck в ваш дистрибутив Linux на основе RedHat/Yum (например, RHEL, Centos и Fedora), выполните следующую команду в своем терминале:

sudo yum установить шеллчек

Запуск шеллчека

После того, как мы установили shellcheck, мы можем провести простой тест со сломанным скриптом. Сначала мы определяем наш скрипт test.sh следующим образом:

#!/bin/wash
echo 'Bash is not wash
echo More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Сколько ошибок вы можете найти? (Совет: их 8!).

Давайте теперь посмотрим, что делает shellcheck из этого кода:

shellcheck test.sh

Сразу же в первой строке обнаруживается проблема со спецификацией shebang. Если вы еще не слышали о shebang, ознакомьтесь с нашей статьей Bash Automation and Scripting Basics Part 1. Наша строка каламбура #!/bin/wash должна быть #!/bin/bash. Давайте исправим это. Проблема 1/8 исправлена!

В то же время мы также исправим две другие проблемы, немедленно распознаваемые shellcheck: Вы забыли закрыть эту строку в одинарных кавычках? для второй строки: точно! Проблема 2/8 исправлена. Что касается третьей проблемы, возникает небольшая путаница в отношении нашего/разработчиков намерения shellcheck, и этого следовало ожидать, так как в строке 2 открывает строку, которая завершается только в строке 5, когда другой виден!

Поскольку эта третья проблема, таким образом, является результатом второй проблемы, этот запуск позволит нам временно исправить две проблемы. Теперь наш скрипт выглядит так:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Давайте снова запустим shellcheck после внесения исправлений и посмотрим, что получится на выходе.

В этом случае shellcheck видит, что \ открывается в строке 3 (даже если он находится в конце строки, на самом деле это открывающая двойная кавычка как таковая ), и даже в конце скрипта (обратите внимание на указание строки 8, которого нет в нашем 6-строчном скрипте с одной пустой строкой после последней строки. Давайте очистим эту пустую строку и исправим проблему двойных кавычек в конце начало строки 3, которое теперь легко понять.Исправлена ошибка 3/8!

Теперь наш скрипт выглядит так:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Повторный запуск shellcheck (обратите внимание, насколько эти шаги снова похожи на использование компилятора в других языках программирования):

Не может быть яснее; Упомянутая синтаксическая ошибка была в этом выражении if и Ожидается, что тест закончится здесь. Мы сделаем, как было предложено, и изменим } на ], чтобы строка читалась как if [ -d ./directory ]; чем . Проблема 4/8 исправлена! Мы перезапустили shellcheck и получили следующее:

Еще одна проблема с одной кавычкой. Мы уже знаем, как это исправить. Давайте обязательно изменим echo! для echo, конечно! < start (исправлена проблема 5/8!) и еще раз перезапустите shellcheck:

Сначала интересно, мы видим, что shellcheck не может разобрать строку. Хотя это может выглядеть как недостаток в shellcheck, читая немного дальше, мы видим, что где-то отсутствует then. Ага! Мы разместили than вместо then. Какая неосторожная ошибка ;) Легко поправимо (проблема 6/8 исправлена!). Теперь наш скрипт выглядит так:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' < start
fif

И еще один запуск shellcheck дает нам еще одну полезную информацию:

У нас отсутствует fi! Ага, да, fif не годится. Мы меняем fif на fi в последней строке исправленного скрипта (выпуск 7/8) и запускаем shellcheck еще раз!

Проблема перенаправления. Честно говоря, я не ожидал, что shellcheck также уловит эту ошибку, так как < можно использовать и в Bash, но это точно произошло. Действительно, наше перенаправление должно было быть > вместо <. Проблема 8/8 — все проблемы — исправлены! Это подводит нас к финальному сценарию

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' > start
fi

Посмотрим, что об этом думает shellcheck.

Идеальный! И скрипт работает отлично, с первого запуска.

Если вы просмотрите вывод различных команд shellcheck, вы также заметите еще одну очень удобную функцию shellcheck, особенно для новичков: отображается набор гиперссылок (ссылок на веб-сайты), по которым можно щелкнуть мышью в окне терминала, или вы можете выберите (при необходимости)> щелкните правой кнопкой мыши, чтобы скопировать, а затем вставьте в браузер. Нажав на такую ссылку, вы перейдете к проекту shellcheck на GitHub.

В спешке?

Если вы хотите быстро проверить только самые важные параметры, вы можете взглянуть на параметр --severity={SEVERITY}, где вы должны заменить {SEVERITY} с одним из ошибка, предупреждение, информация, стиль.

Таким образом, вы ищете только ошибки и предупреждения, вы должны использовать --severity=warning (который включает более высокие уровни, в данном случае это только error) в качестве опции для shellcheck.

Подведение итогов

Если в скрипте нет проблем с логикой, запустив shellcheck перед выполнением скрипта и исправив все обнаруженные проблемы, вы обеспечите почти идеальный запуск с первого раза. Возможно, вы даже сможете использовать shellcheck в этом соревновании по кодированию для вашего следующего живого интервью по кодированию Bash! В этой статье мы рассмотрели различные проблемы, которые могут возникнуть в сценариях, и то, как их обрабатывает shellcheck.

Наслаждайтесь скриптами без ошибок!