Quanto a uma solução para redirecionar muitos comandos de uma só vez:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Por que sua solução original não funciona: exec 2> & 1 redirecionará a saída de erro padrão para a saída padrão do seu shell, que, se você executar o script no console, será seu console. o redirecionamento de canal nos comandos redirecionará apenas a saída padrão do comando.
Do ponto de vista de somecommand
, sua saída padrão entra em um canal conectado tee
e o erro padrão entra no mesmo arquivo / pseudofile que o erro padrão do shell, que você redireciona para a saída padrão do shell, que será o console se você executar seu programa a partir do console.
A única maneira verdadeira de explicar isso é ver o que realmente acontece:
O ambiente original do seu shell pode ficar assim se você o executar no terminal:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Depois de redirecionar o erro padrão para a saída padrão ( exec 2>&1
), você ... basicamente nada muda. Mas se você redirecionar a saída padrão do script para um arquivo, você acabaria com um ambiente como este:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Em seguida, redirecionar o erro padrão do shell para a saída padrão acabaria assim:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
A execução de um comando herdará esse ambiente. Se você executar um comando e canalizá-lo para o tee, o ambiente do comando seria:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Portanto, o erro padrão do seu comando ainda entra no que o shell usa como erro padrão.
Você pode realmente ver o ambiente de um comando olhando em /proc/[pid]/fd
: use ls -l
para também listar o conteúdo do link simbólico. O 0
arquivo aqui é entrada padrão, 1
saída padrão e 2
erro padrão. Se o comando abrir mais arquivos (e a maioria dos programas abrirá), você também os verá. Um programa também pode optar por redirecionar ou fechar o seu padrão de entrada / saída e reutilização 0
, 1
e 2
.
|&
funciona como um atalho para2>&1 |
, pelo menos um pouco mais conveniente.