Desculpe se esta é uma pergunta boba, mas estou tentando realizar algo assim, mas em uma linha:
$ prog1 | prog2
$ prog1 | prog3
Então, basicamente quero executar prog1 e canalizar a saída para prog2 e prog3 separadamente (não um pipe encadeado). No começo, eu estava tentando usar o tee, mas isso não parecia certo porque estava transferindo a saída para um arquivo (o que não é o que eu quero).
$ prog1 | tee prog2 | prog3 # doesn't work - creates file "prog2"
Em algum momento, eu provavelmente gostaria de estender isso para canalizar a saída para mais de dois programas, mas estou começando do zero por enquanto.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Respostas:
Substituição de processo.
fonte
Semelhante à resposta de Ignacio, você pode usar um pipe nomeado temporário usando
mkfifo(1)
.É um pouco mais detalhado, mas funcionaria em sistemas que não têm substituição de processo, como
dash
. Osleep 1
é para lidar com quaisquer condições de corrida.fonte
Há um pequeno utilitário PTEE que faz o trabalho:
Em vez de gravar em arquivos, o ptee grava em todos os fds fornecidos na linha de comando.
ptee faz parte do pipexec .
fonte
Você não precisa de nenhum bashism ou arquivo especial ou nada disso - nem mesmo no Linux:
Marquei os resultados
grep
destacados para mostrar que não eram apenas três resultados do mesmo fluxo, mas também resultados degrep
correspondências de processo separadas .fonte