удар: набор-x регистрируется в файл

У меня есть сценарий оболочки с 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 каждой команды, которые работают в этой оболочке также, таким образом, я не вижу сообщение об ошибке команд.

17
задан 12 August 2016 в 05:43

3 ответа

После больше чем года я нашел правильное решение иметь обоих "нормальный" вывод (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
4
ответ дан 23 November 2019 в 02:21

На основе этого ответа 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 или другим номером, который вы уже присвоили).

19
ответ дан 23 November 2019 в 02:21

Steeldriver дал Вам один подход. С другой стороны, можно просто перенаправить STDERR в файл:

script.sh 2> logfile

, Который, однако, означает, что и вывод, созданный set -x, опция и любые другие произведенные сообщения об ошибках перейдут к файлу. Решение Steeldriver только перенаправит эти set -x вывод, который является, вероятно, что Вы хотите.

3
ответ дан 23 November 2019 в 02:21

Другие вопросы по тегам:

Похожие вопросы: