Saída estranha ao usar o comando tee in pipe

1

Eu tive que usar o seguinte comando em uma tarefa:

who|tee test|wc -l

A saída no meu sistema está abaixo, o que implica que 2 usuários estão conectados:

2

Por que não recebo a saída de who na tela e, logo em seguida, a saída de wc -l ? Eu pensei que tee escreveu a saída para a tela e criou um arquivo com a mesma saída ao mesmo tempo?

A saída de who é encontrada no meu arquivo " teste ", mas ainda assim não faz sentido para mim.

    
por Omnicron 23.10.2017 / 00:06

3 respostas

2

O efeito do piping para tee é que, seja qual for o seu primeiro comando, ele grava em sua saída padrão é gravado em um arquivo (cujo nome você passou como um argumento de linha de comando para tee ), bem como gravado na saída padrão do comando tee . Se o pipeline não continuar e você não executar nenhum redirecionamento no comando tee , a saída padrão do tee será a do seu shell, geralmente seu terminal.

É por isso que executar who e executar who | tee test mostra o mesmo texto no seu terminal. A diferença com tee você também escreve em um arquivo.

Se o pipeline continuar, como no caso de who | tee test | wc -l , então qualquer saída padrão que tenha sido gravada no terminal será enviada para o próximo comando no pipeline. Este é o comando wc e, ao contrário de tee , wc não copia sua entrada para saída padrão (ou em qualquer lugar). Em vez disso, mostra estatísticas. Com a opção -l , mostra apenas as contagens de linhas, o que é tudo o que vê.

Portanto, o motivo pelo qual você vê apenas 2 de who | tee test | wc -l é o mesmo que o motivo pelo qual você vê apenas 2 de who | wc -l . O comando tee grava a saída de who em um arquivo, mas não faz com que ele seja impresso no terminal, a menos que sua saída padrão seja o terminal. Por padrão, geralmente é, mas não quando você canaliza para outro comando.

Se você viu um comando no lado esquerdo de um | cuja saída é exibida no terminal, em vez de ser usado como entrada para o próximo comando no pipeline, provavelmente ele estava gravando para erro padrão em vez da saída padrão.

    
por 23.10.2017 / 00:41
1

tee duplica a entrada para ir para o arquivo e stdout . A partir daí stdout é canalizado para wc ... torna-se stdin para wc . wc apenas retorna contagens, os dados de entrada contados não são ecoados.

Se você está tentando entender, você pode pensar em cmd1 | tee file | cmd2 como tendo o mesmo efeito:

cmd1 > file
cat file | cmd2

Isto não é o que realmente acontece, mas do ponto de vista da pessoa que executa o comando eles parecem ser os mesmos (contanto que cmd1 seja rápido o suficiente para dar a impressão de que tudo acontece quase simultaneamente). Na realidade file está sendo preenchido com dados ao mesmo tempo que cmd2 está recebendo esses dados.

    
por 23.10.2017 / 00:34
0

Para ver as duas who e wc saídas em bash do:

who | tee >(wc -l) test

Saída:

me       tty7         2017-10-16 18:17 (:0)
1

Junto com o conteúdo do teste .

    
por 23.10.2017 / 00:28