redirecionando a variável de script para o arquivo de log sem perder stderr

4

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.

    
por Asaf Magen 14.10.2015 / 16:47

3 respostas

5
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$ 
    
por 14.10.2015 / 16:59
0

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 .

    
por 14.10.2015 / 16:54
0

Consegui corrigir meu redirecionamento com este comando:

  • também me permite controlar exatamente o que estou excluindo.
  • isto é apenas para a versão bash mais antiga que a 4.1 onde BASH_XTRACEFD não é válido.

exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2

    
por 02.03.2016 / 17:29