На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад
Глава 2: Пишем и отлаживаем скрипты
Вперед
Отладка скриптов Bash
Отладка сразу всего скрипта
Когда дела идут не так, как планировалось, необходимо определить, из-за чего в скрипте возникли проблемы. В Bash для отладки предоставляются широкие возможности. Наиболее распространенным способом является запуск подоболочки с параметром -x, благодаря которому весь скрипт будет запущен в отладочном режиме. После того, как для каждой команды будут выполнены все необходимые подстановки и замены, но перед тем, как команда будет выполнена, в стандартный выходной поток будет выдана трассировка команды и все ее аргументы.
В результате скрипт commented-script1.sh будет запущен в отладочном режиме. Отметим еще раз, что добавленные комментарии не будут отображаться в выводе скрипта.
В настоящее время есть полноценный отладчик для Bash, который доступен на SourceForge. Подобные отладочные средства есть в большинстве современных версий Bash, начиная с версий 3.x.
Отладка скрипта по частям
С помощью встроенной команды set, имеющейся в Bash, вы можете запускать в обычном режиме те части скрипта, относительно которых вы уверены, что они работают без ошибок, и отображать отладочную информацию только там, где есть подозрение на неправильную работу. Скажем, мы не уверены, что в примере commented-script1.sh будет делать команда w, поэтому мы можем окружить эту команду следующими отладочными командами:
Выдаваемая информация будет выглядеть следующим образом:
В одном и том же скрипте вы можете включать и выключать отладочный режим столько раз, сколько это необходимо.
В таблице ниже приводится обзор других полезных параметров Bash:
Таблица 2.1. Обзор отладочных параметров
Краткая нотация
Полная нотация
Результат
Отключается генерация имени файла с помощью метасимволов (подстановка).
Командная оболочка печатает входные строки сразу, как они считываются.
Перед исполнением команды выдаются трассировочные данные.
Символ «тире» используется для активации параметра командной оболочки, а символ «плюс» — для его деактивации. Не перепутайте это!
В приведенном ниже примере мы продемонстрируем, как эти параметры используются в командной строке:
Кроме того, эти режимы можно указать в самом скрипте, для этого добавьте соответствующие параметры в первую строку, в которой указывается командная оболочка. Параметры можно объединить, что является обычным приемом при использовании команд UNIX:
Как только вы обнаружили ошибочный фрагмент в вашем скрипте, вы можете добавить инструкции echo перед каждой командой, в работе которой вы не уверены, и можете увидеть, где именно и почему что-то не работает. В примере скрипта commented-script1.sh , если считать, что проблемы возникают при отображении пользователей, это можно сделать, например, следующим образом:
В более сложных скриптах инструкцию echo можно добавлять для отображения значений переменных на различных этапах работы скрипта, что может помочь в обнаружении проблемы:
Источник
🐧 Как отлажидить / проверить скрипты Bash
Как использовать традиционные методы
Как использовать параметр xtrace
Как использовать другие параметры Bash
Как использовать trap
Используя Традиционные Методы
Отладка кода может быть сложной, даже если ошибки просты и очевидны.
Для помощи программистам традиционно использовались такие инструменты, как отладчики и подсветка синтаксиса в редакторах.
Ничего не меняется при написании скриптов Bash.
Простое выделение синтаксиса позволит вам отлавливать ошибки при написании кода, избавляя вас от трудоемкой задачи отслеживания ошибок на более позднем этапе.
Некоторые языки программирования поставляются с сопутствующими средами отладки, такими как gcc и gdb, которые позволяют вам шагать по коду, устанавливать точки останова, исследовать состояние всего в моменты выполнения и многое другое – но, как правило, тут не требуется такой сложный подход, как этот с скрипт оболочки и код просто интерпретируется, а не компилируется в двоичные файлы.
Существуют методы, используемые в традиционных средах программирования, которые могут быть полезны со сложными скриптами Bash, например, с использованием утверждений.
В основном это способы явного утверждения условий или состояния вещей в определенный момент времени.
Утверждения могут выявить даже самые незначительные ошибки.
Они могут быть реализованы в виде короткой функции, которая показывает время, номер строки и тому подобное, или что-то вроде этого:
Как использовать опцию Bash xtrace
При написании скриптов оболочки логика программирования имеет тенденцию быть короче и часто содержится в одном файле.
Таким образом, есть несколько встроенных опций отладки, которые мы можем использовать, чтобы увидеть, что происходит не так.
Первый вариант, который стоит упомянуть, вероятно, самый полезный – параметр xtrace.
Его можно применить к скрипту, вызвав Bash с ключом -x.
Источник
How To Debug a Bash Shell Script Under Linux or UNIX
F rom my mailbag: I wrote a small hello world script. How can I Debug a bash shell scripts running on a Linux or Unix like systems? It is the most common question asked by new sysadmins or Linux/UNIX user. Shell scripting debugging can be a tedious job (read as not easy). There are various ways to debug a shell script.
You need to pass the -x or -v argument to bash shell to walk through each line in the script. Let us see how to debug a bash script running on Linux and Unix using various methods.
-x option to debug a bash shell script
Run a shell script with -x option. $ bash -x script-name $ bash -x domains.sh
Use of set builtin command
Bash shell offers debugging options which can be turn on or off using the set command:
set -x : Display commands and their arguments as they are executed.
set -v : Display shell input lines as they are read.
You can use above two command in shell script itself:
You can replace the standard Shebang line: #!/bin/bash with the following (for debugging) code: #!/bin/bash -xv
Use of intelligent DEBUG function
First, add a special variable called _DEBUG. Set _DEBUG to ‘on’ when you need to debug a script: _DEBUG=»on»
Put the following function at the beginning of the script:
Now wherever you need debugging simply use the DEBUG function as follows: DEBUG echo «File is $filename» OR DEBUG set -x Cmd1 Cmd2 DEBUG set +x
When done with debugging (and before moving your script to production) set _DEBUG to ‘off’. No need to delete debug lines. _DEBUG=»off» # set to anything but not to ‘on’
Save and close the file. Run the script as follows: $ ./script.sh Output:
Now set DEBUG to off (you need to edit the file): _DEBUG=»off» Run script: $ ./script.sh Output:
Above is a simple but quite effective technique. You can also try to use DEBUG as an alias instead of function.
Debugging Common Bash Shell Scripting Errors
Bash or sh or ksh gives various error messages on screen and in many case the error message may not provide detailed information.
Skipping to apply execute permission on the file
When you write your first hello world bash shell script, you might end up getting an error that read as follows: bash: ./hello.sh: Permission denied Set permission using chmod command: $ chmod +x hello.sh $ ./hello.sh $ bash hello.sh
End of file unexpected Error
If you are getting an End of file unexpected error message, open your script file and and make sure it has both opening and closing quotes. In this example, the echo statement has an opening quote but no closing quote:
Also make sure you check for missing parentheses and braces (<>):
No ads and tracking
In-depth guides for developers and sysadmins at Opensourceflare✨
Join my Patreon to support independent content creators and start reading latest guides:
How to set up Redis sentinel cluster on Ubuntu or Debian Linux
How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
How to protect Linux against rogue USB devices using USBGuard
Join Patreon ➔
Missing Keywords Such As fi, esac, ;;, etc.
If you missed ending keyword such as fi or ;; you will get an error such as as “xxx unexpected”. So make sure all nested if and case statements ends with proper keywords. See bash man page for syntax requirements. In this example, fi is missing:
Moving or editing shell script on Windows or Unix boxes
Do not create the script on Linux/Unix and move to Windows. Another problem is editing the bash shell script on Windows 10 and move/upload to Unix server. It will result in an error like command not found due to the carriage return (DOS CR-LF). You can convert DOS newlines CR-LF to Unix/Linux format using the following syntax: dos2unix my-script.sh
Tip 1 – Send Debug Message To stderr
Standard error is the default error output device, which is used to write all system error messages. So it is a good idea to send messages to the default error device:
Tip 2 – Turn On Syntax Highlighting when using vim text editor
Most modern text editors allows you to set syntax highlighting option. This is useful to detect syntax and prevent common errors such as opening or closing quote. You can see bash script in different colors. This feature eases writing in a shell script structures and syntax errors are visually distinct. Highlighting does not affect the meaning of the text itself; it’s made only for you. In this example, vim syntax highlighting is used for my bash script:
Fig.01: Bash shell script syntax highlighting using vim text editor
Tip 3 – Use shellcheck to lint script
ShellCheck is a static analysis tool for shell scripts. One can use it to finds bugs in your shell scripts. It is written in Haskell. You can find warnings and suggestions for bash/sh shell scripts with this tool. Let us see how to install and use ShellCheck on a Linux or Unix-like system to enhance your shell scripts, avoid errors and productivity.
Источник
Как отладить скрипт bash?
У меня проблемы с некоторыми скриптами в bash, по поводу ошибок и неожиданного поведения. Я хотел бы исследовать причины проблем, чтобы я мог применить исправления. Есть ли способ, которым я могу включить некий «режим отладки» для bash, чтобы получить больше информации?
Запустите скрипт bash с помощью bash -x ./script.sh или добавьте его в свой скрипт, set -x чтобы увидеть результаты отладки.
Дополнительно с bash 4.1 или позже:
Если вы хотите записать выходные данные отладки в отдельный файл, добавьте это в ваш скрипт:
Если вы хотите увидеть номера строк, добавьте это:
Если у вас есть доступ к logger команде, вы можете использовать ее для записи отладочной информации через системный журнал с отметкой времени, именем скрипта и номером строки:
Вы можете использовать опцию -p в logger команде для установки индивидуального объекта и уровня , чтобы написать вывод через локальный системный журнал для своей собственной логфайл.
С помощью set -x
Я всегда использую set -x и set +x . Вы можете обернуть области, которые вы хотите видеть, что происходит с ними, чтобы повернуть детализацию вверх / вниз.
log4bash
Также, если вы выполнили работу по разработке и знакомы со стилем логгеров, которые называются log4j, log4perl и т. Д., Вы можете использовать log4bash .
Посмотрим правде в глаза — просто старое эхо просто не режет это. log4bash — это попытка улучшить ведение журнала для сценариев Bash (т. е. сделать так, чтобы вход в Bash меньше занимал).
Оттуда вы можете делать такие вещи в своих скриптах Bash:
В результате этого типа вывода:
log4sh
Если вам нужно что-то более портативное, есть и старшее log4sh . Работы аналогичные log4bash , доступные здесь:
Есть отладчик bash, bashdb , который устанавливается во многих дистрибутивах. Он использует встроенный расширенный режим отладки bash ( shopt -s extdebug ). Это очень похоже на GDB; вот пример сеанса, чтобы придать некоторый вкус:
Как и в GDB, оператор показывается непосредственно перед его выполнением. Таким образом, мы можем исследовать переменные, чтобы увидеть, что будет делать оператор, прежде чем он это сделает.
Это не то, что мы хотим! Давайте снова посмотрим на расширение параметров.
ОК, это работает. Давайте установим newf правильное значение.
Выглядит неплохо. Продолжите сценарий.
Стандартный метод отладки сценариев в большинстве оболочек на основе Bourne, таких как bash, — писать set -x в верхней части сценария. Это сделает bash более подробным о том, что делается / выполняется, и как оцениваются аргументы.
это полезно как для интерпретатора, так и для скриптов. Например:
Выше мы видим, почему поиск не работает из-за некоторых одинарных кавычек.
Чтобы отключить функцию, просто введите set +x .
Использование Eclipse
Вы можете использовать комбинированную среду Eclipse и Shelled с помощью скрипта «_DEBUG.sh», приведенного ниже.
Переключение оболочек
По умолчанию инструмент разработки Shelled используется /bin/dash в качестве интерпретатора. Я изменил это, чтобы /bin/bash иметь лучшую совместимость с большинством примеров оболочек в Интернете и моей средой.
ПРИМЕЧАНИЕ. Вы можете изменить это, выбрав: Окно-> Параметры -> Сценарий оболочки -> Интерпретаторы.
Инструкция по настройке
В пакете Debugger есть шаги по использованию _DEBUG.sh сценария для отладки сценария, который в основном (readme.txt):
Создать проект сценария оболочки: Файл->Создать ->Другое ->Сценарий оболочки ->Мастер проекта сценария оболочки .
Создайте файл сценария Bash: Файл->Создать ->Файл . Для этого примера это будет script.sh . Расширение должно быть «.sh» и является обязательным.
Скопируйте файл _DEBUG.sh в папку проекта.
Вставьте следующий текст в начало файла script.sh :
Если файл создан в Microsoft Windows, то обязательно выполните File-> Convert Line Delimiters To -> Unix .
Настройте конфигурацию запуска отладки: Run-> Debug Configurations -> Bash script . Здесь можно установить 2 поля:
a) «Сценарий Bash:» — путь в рабочей области Eclipse к сценарию Bash для отладки. e) «Порт отладчика: 33333»
Переключитесь на перспективу Debug. Запустите сеанс отладки. Запустите script.sh из оболочки Bash.
Интерфейс отладки bash
Этот bash-отладчик обладает всеми функциями стандартных программных отладчиков, таких как:
Точка останова
Одна пошаговая операция
Функции Step-in, Step-out, Step-over и подпрограммы
Проверка кода или переменных в любой момент во время работы скрипта
Shelled (Shell редактор сценариев) IDE (Integrated Development Environment) имеет дополнительный бонус выполнения проверки контекста, выделяя и отступов при написании сценария. Если он не имеет правильного отступа, вы можете сразу же пометить / указать много ошибок там.