Enviar saída bash -x para logfile sem interromper a saída padrão

8

Existe uma maneira de enviar as informações exibidas executando um script bash com a opção -x para um arquivo, sem alterar a saída padrão vista por um usuário executando o script?

Este é um recurso de depuração que gostaria de implementar em um script bash que usamos e que muda com frequência.

Muito apreciado.

    
por sorry doctor of pink 03.08.2011 / 10:07

3 respostas

15

A saída de -x vai para stderr, não para stdout. Mas mesmo isso pode ser um problema - muitos scripts terão dependências funcionais no conteúdo do stderr, e é um pouco confuso ter os fluxos debug e stderr misturados em alguns casos.

Versões bash > 4.1 oferecem uma solução diferente: a variável de ambiente BASH_XTRACEFD permite que você especifique um descritor de arquivo que será usado para enviar o fluxo de depuração. Isso pode ser um arquivo ou pipe ou qualquer outra coisa que você goste.

# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it  (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19

# turn on the debug stream:
set -x

# run some commands:
cd /etc
find 
echo "Well, that was fun."

# Close the output:
set +x
exec 19>&-

# See what we got:
cat /tmp/my-script.log

Com um pouco mais de brincadeira, você pode fazer outras coisas - como fazer um 'tee' nos stdout e / ou stdin streams, e intercalar aqueles com a saída de depuração, para que seu log seja mais completo. Para mais detalhes, consulte link .

A grande vantagem dessa abordagem sobre alternativas é que você não está arriscando mudanças no comportamento do seu script, injetando a saída de depuração em stdout ou stderr.

    
por 28.02.2014 / 22:18
3

set -x não envia nada para a saída padrão, por isso não há problema. O que faz é gravar no erro padrão, que vai para o console por padrão.

O que você quer fazer é redirecionar o stdout para outro arquivo, como este:

/bin/sh -x /my/script/file 2>/my/log/file
    
por 03.08.2011 / 10:38
1

Veja man tee .

Você o executa como tee commandname filename e exibirá os comandos de saída para stdout e o escreverá também em filename .

    
por 03.08.2011 / 10:19