<Предыдущая | Содержание: | Следующая>
трассировка
Ошибки часто представляют собой случаи неожиданного логического потока в сценарии. То есть части скрипта либо никогда не выполняются, либо выполняются в неправильном порядке или в неправильное время. Чтобы увидеть реальный ход программы, мы используем технику, называемую трассировка.
Один из методов трассировки включает размещение информационных сообщений в сценарии, которые отображают место выполнения. Мы можем добавлять сообщения в наш фрагмент кода:
echo "подготовка к удалению файлов"> & 2
если [[-d $ dir_name]]; тогда, если cd $ dir_name; тогда
echo "удаление файлов"> & 2
rm *
еще
echo "не могу перейти к '$ dir_name'"> & 2 выйти 1
фи еще
echo "такого каталога нет: '$ dir_name'"> & 2 exit 1
fi
echo "удаление файла завершено"> & 2
echo "подготовка к удалению файлов"> & 2
если [[-d $ dir_name]]; тогда, если cd $ dir_name; тогда
echo "удаление файлов"> & 2
rm *
еще
echo "не могу перейти к '$ dir_name'"> & 2 выйти 1
фи еще
echo "такого каталога нет: '$ dir_name'"> & 2 exit 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
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
# проблема: скрипт для демонстрации типичных ошибок number = 1
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
При выполнении результаты выглядят так:
[я @ linuxbox ~] $ беда
+ число = 1
+ '[' 1 = 1 ']'
+ echo 'Число равно 1.' Число равно 1.
[я @ linuxbox ~] $ беда
+ число = 1
+ '[' 1 = 1 ']'
+ echo 'Число равно 1.' Число равно 1.
При включенной трассировке мы видим команды, выполняемые с примененными расширениями. Ведущие знаки плюса указывают на отображение кривой, чтобы отличить их от строк обычного вывода. Знак плюс - это символ по умолчанию для вывода трассировки. Он содержится в PS4 (строка приглашения 4) переменная оболочки. Содержимое этой переменной можно изменить, чтобы сделать подсказку более полезной. Здесь мы изменяем содержимое переменной, чтобы включить текущий номер строки в сценарий, в котором выполняется трассировка. Обратите внимание, что одинарные кавычки необходимы для предотвращения раскрытия до фактического использования подсказки:
[я @ linuxbox ~] $ экспорт PS4 = '$ LINENO +'
[я @ linuxbox ~] $ беда
5 + число = 1
7 + '[' 1 = 1 ']'
8 + echo 'Число равно 1.' Число равно 1.
[я @ linuxbox ~] $ экспорт PS4 = '$ LINENO +'
[я @ linuxbox ~] $ беда
5 + число = 1
7 + '[' 1 = 1 ']'
8 + echo 'Число равно 1.' Число равно 1.
Чтобы выполнить трассировку выбранной части скрипта, а не всего скрипта, мы можем использовать набор команда с -x опции:
#! / Bin / Баш
# проблема: скрипт для демонстрации типичных ошибок number = 1
#! / Bin / Баш
# проблема: скрипт для демонстрации типичных ошибок number = 1
set -x # Включить трассировку
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
set + x # Отключить трассировку
set -x # Включить трассировку
если [$ number = 1]; тогда
echo "Число равно 1." еще
echo "Число не равно 1."
fi
set + x # Отключить трассировку
Мы используем набор команда с -x возможность активировать трассировку и +x возможность деактивировать трассировку. Этот метод можно использовать для изучения нескольких частей сценария устранения неполадок.