
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 canal encadeado). No começo, eu estava tentando usar tee, mas não parecia certo porque estava despejando a saída em 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 apenas começando de forma simples por enquanto.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Responder1
Substituição de processo.
... | tee >(prog2) | ...
Responder2
Semelhante à resposta de Ignacio, você poderia usar um pipe nomeado temporário usando mkfifo(1)
.
mkfifo /tmp/teedoff.$$; cmd | tee /tmp/teedoff.$$ | prog2 & sleep 1; prog3 < /tmp/teedoff.$$; rm /tmp/teedoff.$$
É um pouco mais detalhado, mas funcionaria em sistemas que não possuem substituição de processos, como dash
. O sleep 1
objetivo é lidar com quaisquer condições de corrida.
Responder3
Existe um pequeno utilitáriopaique faz o trabalho:
prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)
Em vez de gravar em arquivos,paigrava em todos os fds fornecidos na linha de comando.
paié parte depipexec.
Responder4
Você não precisa de nenhum bashismo ou arquivo especial ou nada disso - pelo menos não no Linux:
% { prog1 | tee /dev/fd/3 | prog2 >&2 ; } 3>&1 | prog3
{ { printf %s\\t%s\\t%s\\n \
"this uneven argument list" \
"will wrap around" to \
"different combinations" \
"for each line." "Ill pick out" \
"a few words" "and grep for them from" \
"the same stream." |
tee /dev/fd/3 /dev/fd/4 |
grep combination >&2 ; } 3>&1 |
grep pick >&2 ; } 4>&1 |
grep line
different combinations for each *line.* Ill pick out
different combinations for each line. Ill *pick* out
different *combinations* for each line. Ill pick out
Marquei com estrela os resultados grep
destacados para mostrar que não eram apenas três resultados do mesmo fluxo, mas também o resultado de grep
correspondências de processos separados.