Для отладки сценария bash у вас есть несколько вариантов, и некоторые из них даже более эффективны, чем перенаправление stdout/stderr.
Активировать след
Вы можете добавить к своему ~/.bash_profile
(создание трассировки только для определенных частей вашего скрипта) с
set -x # активировать отладку отсюда
<команды>
set +x # остановить отладку отсюда
Также, установить -v
печатает строки ввода оболочки по мере их чтения, и установить +v
деактивирует это.
Только с этим вы, вероятно, поймаете проблему.
Перенаправить трассировку
Использовать Переменная Баша BASH_XTRACEFD
Если задано целое число, соответствующее допустимому файловому дескриптору, Bash запишет вывод трассировки, сгенерированный, когда «set -x» включен, в этот файловый дескриптор. Это позволяет отделить выходные данные трассировки от диагностических сообщений и сообщений об ошибках. Дескриптор файла закрывается, когда BASH_XTRACEFD сбрасывается или ему присваивается новое значение. Сброс BASH_XTRACEFD или присвоение ему пустой строки приводит к тому, что вывод трассировки отправляется в стандартную ошибку. Обратите внимание, что установка для BASH_XTRACEFD значения 2 (стандартный дескриптор файла ошибок) и последующая его отмена приведет к закрытию стандартной ошибки.
Таким образом, вы бы использовали
exec 5> ~/bash_profile_ouput.txt
BASH_XTRACEFD="5"
<команды>
сбросить BASH_XTRACEFD
Печатать номера строк
Использовать Переменная Баша ЛИНЕНО
(и BASH_LINENO
, BASH_SOURCE
и/или FUNCNAME
в более сложных случаях)
echo "Выполнение ${LINENO}"
<команды>
Перенаправить stdout/stderr
Объединить команда исполнитель
с перенаправлением и, возможно, тройник
.
Посмотри ответы здесь, которые также включают в себя другие методы/«трюки», кроме использования исполнитель
.
Связанный:
- https://stackoverflow.com/questions/44249890/pipe-bash-stdout-only-in-debug-mode
- https://unix.stackexchange.com/questions/334382/find-out-what-scripts-are-being-run-by-bash-on-startup
- https://unix.stackexchange.com/questions/155551/как-отладить-а-bash-скрипт