Diferença entre 2 e 1 output.log e 2 e 1 | tee output.log

27

Eu queria saber a diferença entre os dois comandos a seguir

2>&1 > output.log 

e

2>&1 | tee output.log

Eu vi um colega usar a segunda opção para redirecionar. Eu sei o que 2 > & 1 faz, minha única pergunta é qual é o propósito de usar tee onde um simples redirecionamento ">" operador pode ser usado?

    
por Chander Shivdasani 10.09.2011 / 02:50

5 respostas

27

2>&1 >output.log significa primeiro iniciar enviando todo o arquivo manipular 2 coisas (erro padrão) para o identificador de arquivo 1 (saída padrão) então envia para o arquivo output.log . Em outras palavras, envie um erro padrão e uma saída padrão para o arquivo de log.

2>&1 | tee output.log é o mesmo com o 2>&1 bit, combina saída padrão e erro padrão no fluxo de saída padrão. Em seguida, ele canaliza isso por meio do programa tee , que enviará sua entrada padrão para sua saída padrão (como cat ) e também para o arquivo. Por isso, combina os dois fluxos (erro e saída) e, em seguida, envia isso para o terminal e o arquivo.

A linha inferior é que o primeiro envia stderr / stdout para o arquivo, enquanto o segundo envia para ambos o arquivo e saída padrão (que é provavelmente o terminal, a menos que você esteja dentro de outra construção que redirecionou a saída padrão).

Eu menciono essa última possibilidade porque você pode ter coisas como:

(echo hello | tee xyzzy.txt) >plugh.txt

onde nada acaba no terminal.

    
por 10.09.2011 / 03:03
5

O primeiro comando fará a outra tarefa:

Depois

2>&1 > output.log 

o STDOUT antigo será salvo (copiado) no STDERR e então o STDOUT será redirecionado para o arquivo.

Então, o stdout irá para o arquivo e o stderr irá para o console.

E em

 2>&1 | tee output.log

ambos os streams serão redirecionados para tee. Tee duplicará qualquer entrada para sua stdout (o console no seu caso) e para o arquivo ( output.log ).

E há outra forma de primeiro:

    > output.log  2>&1

isto irá redirecionar STDOUT e STDERR para o arquivo.

    
por 10.09.2011 / 02:53
3

O primeiro gera apenas o arquivo. A segunda saída para o arquivo e para a tela.

    
por 10.09.2011 / 02:52
2

O motivo para 2>&1 | tee é poder capturar stdout e stderr em um arquivo de log e vê-lo na tela ao mesmo tempo. Isso pode ser feito como >output.txt 2>&1 & tail -f , mas você não sabe quando o comando em segundo plano é finalizado - o programa é finalizado ou está sendo executado sem saída. O 2>&1 | tee era um idioma comum para programadores.

    
por 11.09.2011 / 01:51
-1

Aqui está uma postagem resumindo os fluxos de saída do Unix: link

Um snippet da postagem:

Existem 3 fluxos de saída padrão:

STDIN - Standard Input - Writes from an input device to the program
STDOUT - Standard Output - Writes program output to screen unless specified otherwise.
STDERR - Standard Error Output - Writes error messages. Also printed to the screen unless specified otherwise.
    
por 17.04.2015 / 05:41