bash: set -x logs para o arquivo

11

Eu tenho um script de shell com set -x para ter uma saída detalhada / de depuração:

#!/bin/bash

set -x
command1
command2
...

A saída é assim:

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

Meu problema é que a saída do shell (causada por set -x ) vai para o stderr, misturada com a saída dos comandos ( command1 , command2 , ...). Eu ficaria feliz em ter a saída "normal" na tela (como o script seria executado sem set -x ) e a saída "extra" do bash separadamente em um arquivo.

Então, eu gostaria de ter isso na tela:

whatever output from command1
whatever output from command2

e isso em um arquivo de log:

+ command1
+ command2

(também é bom se o arquivo de log tiver tudo junto)

O set -x 2> file obviamente não produz o efeito correto, porque não é a saída do comando set, mas altera o comportamento do bash.

Usar bash 2> file para todo o script também não faz a coisa certa, porque ele redireciona o stderr de todos os comandos que são executados neste shell também, então eu não vejo a mensagem de erro dos comandos. / p>     

por redseven 12.08.2016 / 14:43

3 respostas

1

Após mais de um ano, encontrei a solução correta para ter a saída "normal" (stdout + stderr - trace bash) na tela e todos juntos (stdout + stderr + bash trace) em um arquivo (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
    
por redseven 30.01.2018 / 16:23
12

Com base nessa resposta do ServerFault Envie a saída bash -x para o logfile sem interromper a saída padrão , as versões modernas do bash incluem um BASH_XTRACEFD especificamente para especificar um descritor de arquivo alternativo para a saída de set -x

Então, por exemplo, você pode fazer

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

para enviar a saída de set -x para o arquivo logfile , preservando a saída padrão regular e os fluxos de erro padrão para os seguintes comandos.

Observe que o uso de fd 19 é arbitrário - ele só precisa ser um descritor disponível (ou seja, não 0, 1, 2 ou outro número que você já alocou).

    
por steeldriver 12.08.2016 / 15:33
3

A Steeldriver deu a você uma abordagem. Alternativamente, você pode simplesmente redirecionar o STDERR para um arquivo:

script.sh 2> logfile

Isso, no entanto, significa que tanto a saída criada pela opção set -x quanto qualquer outra mensagem de erro produzida irá para o arquivo. A solução da Steeldriver só irá redirecionar a saída set -x , que é provavelmente o que você deseja.

    
por terdon 14.08.2016 / 14:17