user1@mac1:~/tmp$ cat t1.sh
exec 4>shell.log
BASH_XTRACEFD=4
set -x
echo abc
cat ffff
user1@mac1:~/tmp$ bash t1.sh
abc
cat: ffff: No such file or directory
user1@mac1:~/tmp$ cat shell.log
+ echo abc
+ cat ffff
user1@mac1:~/tmp$
Ao definir "set -x" dentro do script bash, ou se você executar o script com bash -x
, você obterá todos os argumentos impressos na tela junto com o stdout.
É possível ter stderr e stdout impressos na tela, mas redirecionando a saída set -x
para o arquivo de log sem que seja impressa na tela?
A idéia é ter todas as informações que posso obter dentro do log, mas só imprimir stdout e stderr regulares na tela.
A saída set -x
vai para stderr
. O que você precisa fazer é redirecionar stderr
, por exemplo:
sh -x your_script.sh 2> debug_info.txt
Se quiser distinguir a saída stderr
devida a set -x
da saída stderr
normal, você pode utilizar o fato de que set -x
output é prefixado com $PS4
, cujo padrão é +
.
bash -x your_script.bash 2> \
\
>(tee >/dev/null \
>(grep '^\+ ' > set_x_output.txt)\
>(grep -v '^\+ ' > rest_of_sdterr.txt)\
)
Se parte de sua saída stderr
normal começar com +
, você poderá alterar o prefixo padrão alterando PS4
.
Consegui corrigir meu redirecionamento com este comando:
exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2
Tags logs io-redirection