Як налагодити скрипт bash?


31

Чи є спосіб налагодити скрипт bash, не використовуючи ехо та реєстрацію?

Я говорю про використання точок прориву та подібних речей.

Відповіді:



20

Існує кілька різних способів, тобто:

  • Запустіть свій скрипт за допомогою параметра -x

    bash -x yourscript.sh
  • Додайте set -xновий рядок на початку свого скрипта після Shebang #!/bin/bashі перед початком сценарію, set -vвідображатиметься рядки введення оболонки, set -xвідображаються виконані команди та аргументи

  • замініть шебанг файлу сценарію #!/bin/bash -xv




4

Ви можете використовувати цю маленьку функцію, щоб перейти в "консоль":

function debug
{
    echo "#############|  Entering DEBUG mode  |####################";
    cmd=""
    while [[ $cmd != "exit" ]]; do
        read -p "> " cmd
        case "$cmd" in
            vars ) ( set -o posix ; set );;
            exit ) ;;
            * ) eval "$cmd";;
        esac
    done
    echo "#############|  End of DEBUG mode |####################";
}

Потім всередині вашого сценарію (ПРИКЛАД):

for file in *; do
...
   if [[ $file == "strange_case.txt" ]]; then
       # break the code here to analyze:
       debug
   fi
...
done

Він прийме будь-яку команду, зберігаючи локальні змінні недоторканими. Щоб вийти з режиму "налагодження", введіть "exit" (сценарій не вийде), і він продовжить код. Якщо ви використовуєте "налагодження" всередині циклу, він щоразу зупинятиметься. Ви можете загорнути його всередину "if" (як у прикладі вище) або створити функцію "watch":

function debug_watch
{
    if [[ $1 == $2 ]]; then
        debug
    fi
}

# And Use it:

debug_watch "$file" "strange_case.txt"

Я також додав команду "vars", яка скидає всі доступні змінні та їх значення. Ви також можете додати власні спеціалізовані команди.

Я зробив код за кілька хвилин, тому використовуйте його на свій страх і ризик. Майте на увазі, що в режимі налагодження може виконуватися будь-яка команда, тому вона створює ризик для безпеки, якщо залишити її у виробничому сценарії.


3
Уникайте використання великих імен змінних. Ваш ризик перекриває спеціальні змінні оболонки та змінні середовища. Крім того, переконайтесь, що ви цитуєте розширення параметрів, коли вони використовуються в якості аргументів, щоб уникнути розбиття слів і розширення імені шляху, що виникають у результаті. наприклад * ) eval "$cmd" ;;і debug_watch "$file" strange_case.txt.
geirha

Відредагований код, як запропонував geirha.
лепе

2

На думку того, що говорить NES, у баші встановлені прапори, щоб дозволити налагодження.

set -xПрапор може бути встановлений і знятий з охороною або з терміналу, або з вашого сценарію. Використання +або -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
set -v      # start verbose output
w | more    
echo ""
echo -n "Number of users: "
set +v      # end verbose output
who | wc -l

Ось що setроблять команди:

  • set -f Вимкнути генерацію імен файлів за допомогою метахарактерів.
  • set -v Друкує (багатослівний) рядки вводу оболонки під час їх читання.
  • set -x Друкувати сліди команд перед виконанням команди.

setнасправді є багато функцій, але на жаль, немає жодної сторінки, оскільки це оболонка, вбудована в інструмент. Посібник з набору знаходиться в документації GNU Bash .

Існує чимало інструментів командного рядка, які допоможуть вам отримати детальну інформацію про вашу програму, наприклад:

  • stat відображення файлу або статусу файлової системи
  • file визначити тип файлу.
  • hexdump фільтр, який відображає вказані файли у різноманітних форматах
  • nohup Запустіть сценарій, який не буде звисати

    та численні інші. Я намагався придумати команду, яка показує приховані символи, але я не можу це зробити прямо зараз. Hexdump зробить це, але є кращий.

Команда key ctrl\призведе до запуску програми або сценарію до дампу core. Тоді ви могли проаналізувати coredump. Я б, мабуть, використовував gdb для аналізу coredump, але для цього існує багато програм.

Оболонка bash також має кілька чудових варіантів налагодження. варіанти --debugger, -vбагатослівні --dump-stringsта інші чудові варіанти, які допоможуть вам. Перевірте їх, використовуючи man bash.

trapКоманди (оболонки вбудованих) можуть бути дуже корисними для вас. trap каже, що якщо ваша програма несподівано виходить, виконайте щось. Ви читаєте про пастку та інші зручні вбудовані Bash Shell тут .

Якщо говорити загалом на даний момент, налагодження - це величезна тема будь-якої мови. Деякі інші теми, які можуть бути зручні для налагодження на будь-якій мові програмування, включають перенаправлення оболонки та обробку сигналів.

Нарешті, я усвідомлюю, що приклад, який я використав, є тривіальним, але деякі сценарії оболонок можуть бути сотнями рядків. У таких ситуаціях мені подобається або вставляти теги коментарів і блокувати код, який я підозрюю, що він несправний, або, як варіант, вставити команду виходу та спробувати ізолювати функціональний код від зламаного коду, використовуючи техніку ділення та підкорити.


1

Параметр GUI для налагодження сценарію bash - це IDE Eclipse з плагінами BashEclipse / Sheched.

Це дає особливості вашого запитання (breakpoints and stuff ) разом з низкою інших функцій для налагодження складних скриптів bash.

Деякі функції включають:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )

  • Перемикач точки перерви
  • Покрокова операція
  • Покрокові, вихідні, перехідні функції та підпрограми
  • Вивчення змінних коду в будь-якій точці під час запуску сценарію
  • Список завдань TODO
  • Список закладок
  • Редагування декількох вікон
  • Віддалений обмін середовищем проекту

Перспектива редактора сценаріїв: Сценарій затемнення IDE

Перспектива налагодження: Перспектива налагодження сценарію затемнення

Етапи використання - додавання модулів Shelledта BashEclipseплагінів до затемнення. Потім запустіть процедуру, надану в текстовому файлі BashEclipse прочитати мене, щоб запустити налагоджувач.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.