Substituição de processos.
... | tee >(prog2) | ...
Desculpe se essa é uma pergunta boba, mas estou tentando realizar algo assim, mas em uma linha:
$ prog1 | prog2
$ prog1 | prog3
Então, eu basicamente quero executar o prog1 e canalizar a saída para o prog2 e o prog3 separadamente (não um pipe encadeado). No início, eu estava tentando usar tee, mas isso não parecia certo, porque estava descarregando a saída para um arquivo (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 por agora.
$ prog1 | prog2
$ prog1 | prog3
$ prog1 | prog4
...
Substituição de processos.
... | tee >(prog2) | ...
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 têm substituição de processo, como dash
. O sleep 1
é para lidar com qualquer condição de corrida.
Existe um pequeno utilitário ptee que faz o trabalho:
prog1 | ptee 2 3 4 2> >(prog2) 3> >(prog3) 4> >(prog4)
Em vez de gravar em arquivos, ptee escreve em todos os fds que são fornecidos na linha de comando.
Optee faz parte do pipexec .
Você não precisa de bashisms ou arquivos especiais ou nada disso - nem mesmo 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
Eu estrelou os resultados grep
em destaque para mostrar que eles não eram apenas três resultados do mesmo fluxo, mas também eram o resultado de correspondências separadas do processo grep
.
Tags pipe