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


52

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

6
Com zsh, você pode usar some_command >output_log_1 >output_log_2.
Jofel

Respostas:


70

Veja man tee:

NOME: tee - leia da entrada padrão e grave na saída e nos arquivos padrão

SINOPSE: tee [OPÇÃO] ... [ARQUIVO] ...

Adequadamente:

echo test | tee file1 file2 file3

o stderr também pode ser redirecionado em mais de um arquivo?
fromnaboo

Sim, isso pode ser feito em virtude do redirecionamento: find / -name test 2> & 1 | tee file1 file2
file3

@akond, cmd 2>&1 | tee log1 log2 tentei executar como acima, mas preciso pressionar ctrl-c para redirecioná-lo para o segundo arquivo de log. também a saída é impressa no console. Desejo que a saída do comando seja redirecionada para os logs, mas não no console. qualquer ajuda é apreciada.
doubledecker

@doubledecker O teecomando grava stdinno (s) arquivo (s) e também no stdout. Se você não deseja que a saída apareça no terminal, é necessário redirecionar para o /dev/nullque normalmente faria.
Minix

4
Também é possível anexar a vários arquivos:echo test | tee --append file1 file2
user1364368

13

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

cmd() {
    echo hello world!
}

Para redirecionar a saída de cmdpara 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 fonte de dados canalizada para tee:

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

Isso também funcionará:

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

Sem o /dev/nullredirecionamento, o tee enviará a saída para o 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á com a mensagem de status que é enviada para você (veja também a resposta de Gilles aqui https://unix.stackexchange.com/a/100833/3998 ).

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); portanto, ele deve funcionar em qualquer versão recente do GNU bash.


@doubledecker - parece que satisfaz suas condições, portanto pode ser aceito como resposta. Além disso, +1 como eu testei isso no GNU bash ( version 4.3.11(1)-release (i686-pc-linux-gnu)) no Ubuntu 14.04.
Belacqua

9

É um post antigo, mas eu o encontrei agora ...

Em vez de redirecionar a saída para > /dev/nullvocê, 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

isso é mais ou menos o que outra resposta disse (exceto -a no T)
Archemar

Este é o caminho a percorrer.
71

5

Como o @jofel mencionado em um comentário na resposta, isso pode ser feito nativamente em zsh:

echo foobar >file1 >file2 >file3

ou, com expansão de braçadeira:

echo foobar >file{1..3}

Internamente, isso funciona de maneira muito semelhante às teerespostas fornecidas acima. O shell conecta o stdout do comando a um processo que canaliza para vários arquivos; portanto, não há qualquer vantagem técnica convincente para fazê-lo desta maneira (mas não uma boa aparência real). Veja o zshmanual para mais informações.


2

Não é possível comentar, no entanto, outra maneira de expressar

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

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

echo "foobarbaz" | tee file{1..8} > /dev/null

2
Como isso é realmente diferente das outras respostas já dadas? Especialmente desde que poucas pessoas provavelmente querem literal file1através de file8como seus nomes e esses são provavelmente apenas a exemplo espaços reservados para os nomes dos arquivos
Eric Renouf

11
Provavelmente ou não, esta é exatamente a solução que eu precisava e pensei que poderia ajudar outra pessoa.
user149146

-2

Eu precisava de um arquivo de log de sessão e outro arquivo para todas as sessões que fiz:

echo blabla |tee thisession >>allsessions


O teecomando já foi mencionado.
RalfFriedl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.