Перенаправить весь вывод в bash script при использовании set -x
У меня есть bash script, у которого set -x
. Можно ли перенаправить отладочные отпечатки этого script и всех его результатов в файл? В идеале я хотел бы сделать что-то вроде этого:
#!/bin/bash
set -x
(some magic command here...) > /tmp/mylog
echo "test"
и получим
+ echo test
test
вывод в /tmp/mylog, а не в stdout.
Ответы
Ответ 1
Это то, что я только что искал в googled, и я помню, как я использовал это некоторое время назад...
Используйте exec для перенаправления как стандартного вывода, так и стандартной ошибки всех команд в скрипте:
#!/bin/bash
logfile=$$.log
exec > $logfile 2>&1
Для получения дополнительной магии перенаправления проверьте Advanced Bash Scripting Guide - Перенаправление ввода-вывода.
Если вы также хотите видеть вывод и отладку на терминале в дополнение к файлу журнала, см. Переадресацию COPY stdout в файл журнала из самого скрипта bash.
Если вы хотите обрабатывать назначение трассировки трассировки set -x
независимо от обычных STDOUT
и STDERR
, см. Bash, чтобы сохранить вывод набора -x в файл журнала.
Ответ 2
вывод -x
выводится на stderr, поэтому для его регистрации выполните:
set -x
exec 2>/tmp/mylog
Ответ 3
Чтобы перенаправить stderr и stdout:
exec &>> $LOG_FILE_NAME
Если вы хотите добавить в файл. Чтобы перезаписать файл:
exec &> $LOG_FILE_NAME
Ответ 4
В моем случае сценарий вызывался несколько раз из других мест, и я не видел всего, поэтому вместо этого я сделал добавление, и это сработало:
exec 1>>FILENAME 2>&1
set -x
Чтобы избежать путаницы, обязательно удаляйте FILENAME перед каждым запуском.