Se eu entendi corretamente, você está procurando o equivalente a tee file1 file2 file3
, mas em vez de gravar os mesmos dados em três arquivos file1
, file2
e file3
, você deseja enviar os mesmos dados três comandos cmd1
, cmd2
e cmd3
, ou seja
… | ??? cmd1 cmd2 cmd3
deve ser equivalente a
… | cmd1 &
… | cmd2 &
… | cmd3 &
exceto que …
seria executado apenas uma vez.
Existem duas maneiras de fazer isso.
Ksh93, bash e zsh suportam substituição de processos . Essa é uma generalização de pipes que permite que o argumento de um comando seja um arquivo que, quando gravado, passa dados como entrada para um comando (também existe a variante de entrada que, quando lida, obtém a saída de dados por um comando) . Isto é,
echo hello | tee >(cmd1)
imprime hello
para a saída padrão e, além disso, executa cmd1
com hello
como entrada.
Por exemplo, se você quiser duplicar a entrada de somecommand
e passá-la para ambos os grupos cmd1
e cmd2
, você pode usar
somecommand | tee >(cmd1) | cmd2
Se o seu shell não suportar a substituição do processo, você poderá usar pipes nomeados. Veja a resposta do Arcege para saber como isso funciona. Os pipes nomeados são menos convenientes do que a substituição do processo porque você precisa criá-los e excluí-los, além de iniciar e sincronizar os processos manualmente. Eles têm a vantagem de serem totalmente portáteis, enquanto nem todos os shells suportam substituições de processos. Eles também podem ser usados em cenários diferentes daqueles para os quais a substituição do processo serve.
Sob o capô, em alguns sistemas, a substituição de processos usa pipes nomeados internamente. Na maioria dos sistemas, porém, ele se baseia em arquivos nomeados representando os descritores de arquivos .