bash: установить -x журналы в файл

10

У меня есть сценарий оболочки с set -x , чтобы иметь подробный / отладочный вывод:

#!/bin/bash

set -x
command1
command2
...

Результат выглядит следующим образом:

+ command1
whatever output from command1
+ command2
whatever output from command2

Моя проблема заключается в том, что вывод оболочки (вызванный set -x ) поступает в stderr, смешанный с выходом команд ( command1 , command2 , ...). Я был бы рад иметь «нормальный» вывод на экране (например, скрипт woud run без set -x ) и «дополнительный» вывод bash отдельно в файле.

Поэтому я хотел бы иметь это на экране:

whatever output from command1
whatever output from command2

и это в файле журнала:

+ command1
+ command2

(также отлично, если файл журнала имеет все вместе)

set -x 2> file , очевидно, не имеет правильного эффекта, потому что это не результат команды set, но он изменяет поведение bash.

Использование bash 2> file для всего скрипта также не подходит, потому что оно перенаправляет stderr каждой команды, которая запускается в этой оболочке, поэтому я не вижу сообщение об ошибке команд.     

задан redseven 12.08.2016 в 12:43
источник

3 ответа

1

Спустя более года я нашел правильное решение, чтобы иметь как «нормальный» вывод (stdout + stderr - bash trace) на экране, так и все вместе (stdout + stderr + bash trace) в файле (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
    
ответ дан redseven 30.01.2018 в 15:23
источник
12

Основываясь на этом ответе ServerFault Отправляйте вывод bash -x в файл журнала без прерывания стандартного вывода , в современных версиях bash есть BASH_XTRACEFD специально для указания альтернативного файлового дескриптора для вывода set -x

Так, например, вы можете сделать

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

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

Обратите внимание, что использование fd 19 произвольно - это просто должен быть доступный дескриптор (т. е. не 0, 1, 2 или другой номер, который вы уже назначили).

    
ответ дан steeldriver 12.08.2016 в 13:33
3

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

script.sh 2> logfile

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

ответ дан terdon 14.08.2016 в 12:17