Redirect e saída de pipe

4

rpm -qa > file | wc -l retorna 0. O que estou fazendo de errado? Eu acho que está claro qual é o meu objetivo, mas não está funcionando. Este é um trabalho para xargs ou tee ?

    
por user75027 20.08.2014 / 09:06

4 respostas

4

Sim, isso é trabalho para tee:

rpm -qa | tee file | wc -l

Nesta construção, o stdout de a | b a vai para stdin de b. No caso de a > file | b , todas as saídas formam um arquivo e nada vai para b stdin. O comando tee faz uma cópia de tudo que recebe no stdin para o arquivo e stdout.

    
por 20.08.2014 / 09:15
5

Sim, este é um trabalho para tee :

rpm -qa | tee file | wc -l

Redirecionamento do shell ( > ) é apenas isso - redirecionamento - e você só pode apontar o fluxo de saída para um outro lugar de cada vez. Não há mais nada para o | ver nesse momento. tee é feito exatamente para essa finalidade, em que você deseja dividir o fluxo em duas partes , um indo para um arquivo e outro ainda na saída padrão. O comando acima faz exatamente o que você estava tentando fazer.

xargs não ajuda aqui.

    
por 20.08.2014 / 09:12
2
rpm -qa > file ; wc -l file

deve fazer o que quiser.

    
por 20.08.2014 / 09:10
0

Em qualquer shell que seja compatível com Bourne ou POSIX, os redirecionamentos são processados da esquerda para a direita e o pipe é o primeiro. Assim, seu comando é executado dessa maneira (omito o que acontece no subprocesso 2):

  1. Crie um canal.
  2. Bifurque dois subprocessos, 1 e 2.
  3. Redireciona a saída padrão de 1 para o pipe.
  4. Redirecione a saída padrão de 1 para file .
  5. Em 1, execute rpm -qa .

Se você quiser que a saída do subprocesso 1 seja replicada em dois canais (o arquivo e o canal), alguém terá que fazer o trabalho de fazer duas cópias dos dados. Isso é exatamente o que tee é para.

rpm -qa | tee file | wc -l

O Zsh tem um recurso interno para replicação de saída, chamado multios . Em zsh (e somente em zsh com a opção multios deixada, não em shells compatíveis com POSIX nem em shells pré-POSIX Bourne, nem em (t) csh quanto a isso), um comando como o que você escreveu é replicado os dados nos dois redirecionamentos de saída.

# in zsh
rpm -qa >file | wc -l
    
por 21.08.2014 / 01:33