<Попередній | зміст | Наступна>
Простеження
Помилки часто є випадками несподіваного логічного потоку в сценарії. Тобто частини сценарію або ніколи не виконуються, або виконуються в неправильному порядку або не в той час. Для перегляду фактичного ходу програми ми використовуємо техніку, яка називається tracing.
Один із методів трасування передбачає розміщення інформаційних повідомлень у сценарії, який відображає місце виконання. Ми можемо додати повідомлення до нашого фрагмента коду:
echo "підготовка до видалення файлів" >&2
якщо [[ -d $dir_name ]]; тоді якщо cd $dir_name; тоді
echo "видалення файлів" >&2
rm *
ще
echo "неможливо перейти до '$dir_name'" >&2 вихід 1
fi ще
echo "немає такого каталогу: '$dir_name'" >&2 вихід 1
fi
echo "видалення файлу завершено" >&2
echo "підготовка до видалення файлів" >&2
якщо [[ -d $dir_name ]]; тоді якщо cd $dir_name; тоді
echo "видалення файлів" >&2
rm *
ще
echo "неможливо перейти до '$dir_name'" >&2 вихід 1
fi ще
echo "немає такого каталогу: '$dir_name'" >&2 вихід 1
fi
echo "видалення файлу завершено" >&2
Ми надсилаємо повідомлення до стандартної помилки, щоб відокремити їх від звичайного виводу. Ми також не робимо відступи в рядках, що містять повідомлення, тому легше знайти, коли настав час їх видалити.
Тепер, коли скрипт виконується, можна побачити, що видалення файлу виконано:
[me@linuxbox ~]$ deletion-script готується до видалення файлів, видаляючи файли
видалення файлу завершено [me@linuxbox ~]$
[me@linuxbox ~]$ deletion-script готується до видалення файлів, видаляючи файли
видалення файлу завершено [me@linuxbox ~]$
bash також надає метод трасування, реалізований за допомогою параметра -x і команди set з параметром -x. Використовуючи наш попередній сценарій проблем, ми можемо активувати трасування для всього сценарію, додавши параметр -x до першого рядка:
#!/bin/bash -x
#!/bin/bash -x
Налагодження
# проблема: скрипт для демонстрації поширених помилок number=1
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
# проблема: скрипт для демонстрації поширених помилок number=1
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
Після виконання результати виглядають так:
[me@linuxbox ~]$ біда
+ число=1
+ '[' 1 = 1 ']'
+ echo 'Число дорівнює 1.' Число дорівнює 1.
[me@linuxbox ~]$ біда
+ число=1
+ '[' 1 = 1 ']'
+ echo 'Число дорівнює 1.' Число дорівнює 1.
Якщо ввімкнено трасування, ми бачимо, що команди виконуються із застосованими розширеннями. Початкові знаки плюса вказують на відображення сліду, щоб відрізнити їх від рядків звичайного виводу. Знак плюс є символом за замовчуванням для виведення трасування. Він міститься в PS4 (рядок підказки 4) змінна оболонки. Вміст цієї змінної можна змінити, щоб зробити підказку більш корисною. Тут ми змінюємо вміст змінної, щоб включити поточний номер рядка в сценарій, де виконується трасування. Зауважте, що одинарні лапки необхідні, щоб запобігти розширенню, доки підказка не буде фактично використана:
[me@linuxbox ~]$ експорт PS4='$LINENO +'
[me@linuxbox ~]$ біда
5 + число=1
7 + '[' 1 = 1 ']'
8 + echo 'Число дорівнює 1.' Число дорівнює 1.
[me@linuxbox ~]$ експорт PS4='$LINENO +'
[me@linuxbox ~]$ біда
5 + число=1
7 + '[' 1 = 1 ']'
8 + echo 'Число дорівнює 1.' Число дорівнює 1.
Щоб виконати трасування для виділеної частини сценарію, а не для всього сценарію, ми можемо використовувати комплект з командою -x опції:
#! / бін / баш
# проблема: скрипт для демонстрації поширених помилок number=1
#! / бін / баш
# проблема: скрипт для демонстрації поширених помилок number=1
set -x # Увімкнути трасування
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
set +x # Вимкнути трасування
set -x # Увімкнути трасування
якщо [ $число = 1 ]; тоді
echo "Число дорівнює 1." інше
echo "Число не дорівнює 1."
fi
set +x # Вимкнути трасування
Ми використовуємо комплект з командою -x можливість активації трасування та +x можливість вимкнути трасування. Цю техніку можна використовувати для вивчення кількох частин проблемного сценарію.