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