Eu tenho um script de shell com set -x
a saída detalhada / depuração:
#!/bin/bash
set -x
command1
command2
...
A saída é assim:
+ command1
whatever output from command1
+ command2
whatever output from command2
Meu problema é, a saída de shell (causada por set -x
) vai para o stderr, misturado com a saída dos comandos ( command1
, command2
...). Eu ficaria feliz em ter a saída "normal" na tela (como o script sem o woud 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 doens't ter o efeito certo, porque não é a saída do comando set, mas mudar o comportamento do bash.
Usar bash 2> file
o script inteiro também não faz a coisa certa, porque redireciona o stderr de todos os comandos que são executados neste shell, portanto, não vejo a mensagem de erro dos comandos.
fonte
Respostas:
Com base nesta resposta ServerFault Envie a saída bash -x para o arquivo de log sem interromper a saída padrão , as versões modernas do bash incluem um
BASH_XTRACEFD
específico para especificar um descritor de arquivo alternativo para a saída deset -x
Então, por exemplo, você pode fazer
para enviar a saída
set -x
para o arquivologfile
, preservando a saída padrão regular e os fluxos de erro padrão para os seguintes comandos.Observe que o uso do 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).
fonte
Depois de mais de um ano, encontrei a solução certa para exibir a saída "normal" (stdout + stderr - bash trace) na tela e todos juntos (stdout + stderr + bash trace) em um arquivo (bash.log) :
fonte
A Steeldriver ofereceu uma abordagem. Como alternativa, você pode simplesmente redirecionar o STDERR para um arquivo:
Isso, no entanto, significa que a saída criada pela
set -x
opção e quaisquer outras mensagens de erro produzidas irão para o arquivo. A solução da Steeldriver redirecionará apenas aset -x
saída que provavelmente é o que você deseja.fonte