У меня есть сценарий оболочки, set -x
чтобы иметь подробный / отладочный вывод:
#!/bin/bash
set -x
command1
command2
...
Вывод выглядит так:
+ command1
whatever output from command1
+ command2
whatever output from command2
Моя проблема, выход оболочки (вызванный set -x
) идет в поток ошибок, смешанного с выходом команд ( command1
, command2
, ...). Я был бы рад иметь на экране «нормальный» вывод (например, скрипт без запуска set -x
) и «дополнительный» вывод bash отдельно в файле.
Так что я хотел бы иметь это на экране:
whatever output from command1
whatever output from command2
и это в лог-файле:
+ command1
+ command2
(также хорошо, если в файле журнала есть все вместе)
set -x 2> file
Явно doens't принять правильное действие, потому что это не выход из команды набора, но изменить поведение Баша.
Использование bash 2> file
для всего сценария также не дает правильных результатов, потому что оно перенаправляет stderr каждой команды, которая также выполняется в этой оболочке, поэтому я не вижу сообщения об ошибках команд.
источник
Ответы:
Основываясь на этом ответе ServerFault Отправка вывода bash -x в файл журнала без прерывания стандартного вывода , современные версии bash включают
BASH_XTRACEFD
специально для указания альтернативного дескриптора файла для выводаset -x
Так, например, вы можете сделать
отправить выходные данные
set -x
в файлlogfile
, сохраняя при этом стандартные стандартные выходные данные и стандартные потоки ошибок для следующих команд.Обратите внимание, что использование fd 19 является произвольным - это просто должен быть доступный дескриптор (то есть не 0, 1, 2 или другое число, которое вы уже присвоили).
источник
Спустя более года я нашел правильное решение, чтобы и «нормальный» вывод (stdout + stderr - bash trace) на экране и все вместе (stdout + stderr + bash trace) в файле (bash.log) :
источник
Steeldriver дал вам один подход. Кроме того, вы можете просто перенаправить STDERR в файл:
Это, однако, означает, что и выходные данные, созданные
set -x
опцией, и любые другие сообщения об ошибках будут отправлены в файл. Решение Steeldriver будет только перенаправлятьset -x
вывод, что, вероятно, то, что вы хотите.источник