Thank you for reading this post, don't forget to subscribe!
При работе с языками программирования есть интегрированный с ними инструмент отладки. Однако в сценариях bash у нас нет такого инструмента, но мы можем использовать командную строку для выполнения отладки.
Ниже приведены некоторые доступные параметры отладки в командной строке:
- параметр -x – отображает следы команд до их выполнения
- параметр -n – не отображает команду, просто проверяет синтаксические ошибки
- параметр -v – отображает команды во время их чтения
Мы используем ОС Debian 10 для объяснения процедуры, обсуждаемой в этой статье.
Отслеживание выполнения (опция -x)
Он указывает оболочке отображать, как каждая команда выглядит перед выполнением. Кроме того, он дает вам выбор, отлаживать ли сценарий целиком или только его часть.
Отладка всего сценария
Запуск оболочки с параметром –x запустит весь сценарий в режиме отладки. В этом режиме следы команд и их аргументов отображаются на выходе до их выполнения.
Это наш пример сценария с именем «myscript.sh»:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash exec 5> debug_output.txt BASH_XTRACEFD="5" PS4='$LINENO: ' var="Привет мир!" # печать echo "$var" # альтернативный способ печати printf "%s\n" "$var" echo "Мой дом - это: $HOME" |
Чтобы запустить весь сценарий в режиме отладки, добавьте параметр -x перед запускающим скриптом следующим образом:
1 |
$ bash -x ./script_name.sh |
В нашем примере это будет:
1 |
$ bash -x ./myscript.sh |
Ниже наш «myscript.sh» работает в режиме отладки. Добавленные комментарии не печатаются в отлаженном выводе.
Отладка части скрипта
Если мы уверены, что только часть скрипта вызывает ошибки, тогда нет необходимости отлаживать весь скрипт. Мы можем отладить часть или несколько частей скрипта следующим образом:
Поместите опцию «set –x» в начальную точку области, в которой требуется отладка, и поместите опцию «set + x» там, где вы хотите, чтобы она остановилась. Например, в следующем скрипте мы хотим отладить область, начиная с $var, потому что мы думаем, что она работает не так, как ожидалось. Поэтому мы заключим его, поместив опцию set –x перед строкой $var, и закончим, поместив опцию set + x во вторую последнюю строку.
Отредактируйте файл сценария с помощью любого редактора. Для этого мы используем редактор nano:
1 |
$ sudo nano myscript.sh |
Теперь заключите область, которую вы хотите отладить, используя параметр set –x и set + x, как описано выше.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash exec 5> debug_output.txt BASH_XTRACEFD="5" PS4='$LINENO: ' set -x var="Привет мир" # печать echo "$var" # альтернативный способ печати printf "%s\n" "$var" set +x echo "Мой дом - это: $HOME" |
После этого используйте Ctrl + O для сохранения, а затем Ctrl + X для выхода из файла.
Затем запустите приведенную ниже команду, чтобы выполнить сценарий:
1 |
$ ./myscript.sh |
Отключение оболочки (параметр -n)
Параметр -n (сокращение от noexec или без выполнения) включает режим проверки синтаксиса. Он указывает оболочке не выполнять команды, а просто проверять синтаксические ошибки. Это безопасный способ выполнить отладку, поскольку он не выполняет команды, если они содержат какую-либо ошибку.
Для запуска этого режима используйте следующий синтаксис:
1 |
$ sh –n ./script_name |
Это наш пример сценария с именем «myscript1.sh»:
1 2 3 4 5 |
#!/bin/bash var="Привет мир" echo "$var" echo "Мой домашний каталог is=$HOME echo "Мое имя is=$USER" |
Когда мы запускаем сценарий без какой-либо опции отладки, он показывает следующий результат:
Чтобы отладить сценарий с параметром –n , используйте следующую команду:
1 |
$ sh -n ./myscript1.sh |
Отображение команд сценария (параметр -v)
-v (сокращение от verbose) указывает оболочке работать в подробном режиме. При использовании этого режима он отображает все команды в сценарии перед их выполнением.
Для запуска этого режима используйте следующий синтаксис:
1 |
$ sh –v ./script_name |
Это наш пример сценария с именем «myscript1.sh:»
1 2 3 4 5 |
#!/bin/bash var="Привет мир" echo "$var" echo "Мой домашний каталог is=$HOME” echo "Мое имя is=$USER" |
Это то, что наш скрипт, когда мы выполняем его без какой-либо опции отладки.
Теперь, когда мы выполняем его с параметром –v, он отображает команды до их результатов.