У меня есть сценарий оболочки с set -x
иметь подробный вывод / вывод отладки:
#!/bin/bash
set -x
command1
command2
...
Вывод похож на это:
+ command1
whatever output from command1
+ command2
whatever output from command2
Моя проблема, вывод оболочки (вызванный set -x
) переходит к stderr, смешанному с выводом команд (command1
, command2
...). Я был бы рад иметь "нормальный" вывод на экране (как сценарий woud выполненный без set -x
) и "дополнительный" вывод удара отдельно в файле.
Таким образом, я хотел бы иметь это на экране:
whatever output from command1
whatever output from command2
и это в файле журнала:
+ command1
+ command2
(также прекрасный, если файл журнала имеет все вместе),
set -x 2> file
очевидно, doens't берут правильный эффект, потому что это не вывод команды набора, но это изменяет поведение удара.
Используя bash 2> file
поскольку весь сценарий также не делает правильной вещи, потому что это перенаправляет stderr каждой команды, которые работают в этой оболочке также, таким образом, я не вижу сообщение об ошибке команд.
После больше чем года я нашел правильное решение иметь обоих "нормальный" вывод (stdout + stderr - трассировка удара) на экране и всех вместе (stdout + stderr + трассировка удара) в файле (bash.log):
exec > >(tee -ia bash.log)
exec 2> >(tee -ia bash.log >& 2)
exec 19> bash.log
export BASH_XTRACEFD="19"
set -x
command1
command2
На основе этого ответа ServerFault Отправка вывода bash -x в лог-файл без прерывания стандартного вывода , современные версии bash включают BASH_XTRACEFD
специально для указания альтернативного дескриптора файла для вывода set -x
[ 116]
Так, например, вы можете сделать
#!/bin/bash
exec 19>logfile
BASH_XTRACEFD=19
set -x
command1
command2
...
, чтобы отправить вывод set -x
в файл logfile
, сохраняя при этом обычный стандартный вывод и стандартные потоки ошибок для следующих команд.
Обратите внимание, что использование fd 19 произвольно - оно просто должно быть доступным дескриптором (т.е. не 0, 1, 2 или другим номером, который вы уже присвоили).
Steeldriver дал Вам один подход. С другой стороны, можно просто перенаправить STDERR в файл:
script.sh 2> logfile
, Который, однако, означает, что и вывод, созданный set -x
, опция и любые другие произведенные сообщения об ошибках перейдут к файлу. Решение Steeldriver только перенаправит эти set -x
вывод, который является, вероятно, что Вы хотите.