Использование shellcheck для поиска и исправления ошибок скриптов — CloudSavvy IT

Shutterstock / MarcoVector

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

Что Shellcheck?

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

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

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

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

Установка Shellcheck

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

sudo apt install shellcheck

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

sudo yum install shellcheck

Бег Shellcheck

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

#! / bin / wash echo 'Bash не является размытым echo Больше ошибок для меня "if [ -d ./directory }; than
  echo 'sure! < start
fif


How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Shellcheck output 1

Immediately on the first line it finds an issue with the shebang specification. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 article. Our pun shebang line #!/bin/wash should be #!/bin/bash. Let’s fix this. Issue 1/8 fixed!

We will also at the same time fix the other two issues immediately recognized by shellcheck: Did you forget to close this single quoted string? for the second line: spot on! Issue 2/8 fixed. For the third issue there is a little confusion as to our/the developers intent for shellcheck, and this is to be expected, as the ' on line 2 opens a string which is only terminated on line 5 when another ' is seen!

As this third issue is thus a result of the second issue, this run will allow us to fix two issues for the time being. Our script now looks like this:

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


Let’s run shellcheck on this again after making the corrections and see what the output is.

Shellcheck output 2

In this instance, shellcheck sees that a " is opened on line 3 (even though it is at the end of the line, it is actually an opening double quote as such), and that even at script end (note the line 8 indication, which does not exist in our 6-line script with a single empty line after the last line. Let’s clean up this empty line, and fix the double quoting issue at the start of line 3, which can now be readily understood. Issue 3/8 fixed!

Our script now looks like this:

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

Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):

Bash shellcheck output 3

Could not be clearer; The mentioned syntax error was in this if expression and Expected test to end here. We shall do as suggested and change the } to ], делая строку читаемой if [ -d ./directory ]; than. Исправлена ​​ошибка 4/8! Мы повторно запустили shellcheck и теперь получаем следующее:

вывод shellcheck 4

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

Результат Shellcheck 5

На первый взгляд интересно, что 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 дает нам еще одну полезную информацию:

Результат Shellcheck 6

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

Вывод Shellcheck 7

Проблема с перенаправлением. Я честно не ожидал 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 8

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

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

В спешке?

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

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

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

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

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *