Se bem entendi, você está procurando o equivalente a tee file1 file2 file3, mas ao invés de escrever os mesmos dados para três arquivos file1, file2e file3, que pretende canalizar os mesmos dados em três comandos cmd1, cmd2e cmd3, isto é,
… | ??? cmd1 cmd2 cmd3
deve ser equivalente a
… | cmd1 &
… | cmd2 &
… | cmd3 &
exceto que isso …seria executado apenas uma vez.
Existem duas maneiras de fazer isso.
Ksh93, bash e zsh suportam a substituição do processo . Essa é uma generalização de pipes que permite que o argumento de um comando seja um arquivo que, quando gravado, transmite dados como entrada para um comando (também existe a variante de entrada que, quando lida, obtém dados de saída por um comando) . Isso é,
echo hello | tee >(cmd1)
gravuras hellopara a saída padrão e em adição é executada cmd1com hellocomo entrada.
Por exemplo, se você deseja duplicar a entrada somecommande passá-la para ambos cmd1e cmd2, 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 da Arcege para saber como isso funciona. Os pipes nomeados são menos convenientes do que a substituição do processo, porque você deve criá-los e excluí-los, além de iniciar e sincronizar 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 de processo é.
Sob o capô, em alguns sistemas, a substituição de processos usa pipes nomeados internamente. Na maioria dos sistemas, no entanto, ele se baseia em arquivos nomeados que representam descritores de arquivos .