como redirecionar a saída para vários arquivos de log

37

Como redirecionar a saída padrão para vários arquivos de log? O seguinte não funciona:

some_command 1> output_log_1 output_log_2 2>&1
    
por doubledecker 21.06.2012 / 07:49

5 respostas

55

Veja man tee :

NAME: tee - read from standard input and write to standard output and files

SYNOPSIS: tee [OPTION]... [FILE]...

Assim:

echo test | tee file1 file2 file3
    
por 21.06.2012 / 08:00
10

Digamos que sua saída seja gerada a partir de uma função, cmd() :

cmd() {
    echo hello world!
}

Para redirecionar a saída de cmd para dois arquivos, mas não para o console, você pode usar:

cmd | tee file1 file2 >/dev/null

Isso funcionará para vários arquivos, considerando qualquer canal de origem de dados para tee:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

Isso também funcionará:

echo $(cmd) | tee file1 file2 >/dev/null

Sem o redirecionamento /dev/null , o tee enviará a saída para stdout além dos arquivos especificados.

Por exemplo, se isso for executado no console, você verá a saída lá. Executar a partir de um crontab, a saída aparecerá a mensagem de status que é enviada para você (veja também a resposta de Gilles aqui link ).

Isso funcionou para mim no bash no Ubuntu 12.04, e foi verificado no Ubuntu 14.04 usando o GNU bash 4.3.11 (1), então ele deve funcionar em qualquer versão bash do GNU.

    
por 08.09.2012 / 01:54
8

É um post antigo, mas acabei de encontrá-lo agora ...

Em vez de redirecionar a saída para > /dev/null , você pode redirecioná-la para o último arquivo:

echo "foobarbaz" | tee file1 > file2

Ou para anexar a saída:

echo "foobarbaz" | tee -a file1 >> file2
    
por 29.04.2016 / 10:57
3

Como @jofel mencionado em um comentário sob a resposta, isso pode ser feito de forma nativa em zsh :

echo foobar >file1 >file2 >file3

ou, com a expansão da chave:

echo foobar >file{1..3}

Internamente, isso funciona de maneira muito semelhante às respostas tee fornecidas acima. O shell conecta o stdout do comando a um processo que canaliza para vários arquivos; portanto, não há nenhuma vantagem técnica convincente em fazer isso dessa maneira (mas faz parecer muito bom). Consulte o manual zsh para saber mais.

    
por 16.02.2017 / 17:29
2

Incapaz de comentar, no entanto, outra maneira de expressar

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

Poderia ser simplificado para isso, ao lidar com muitos arquivos.

echo "foobarbaz" | tee file{1..8} > /dev/null
    
por 28.12.2015 / 15:40