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
, file2
e file3
, que pretende canalizar os mesmos dados em três comandos cmd1
, cmd2
e 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 hello
para a saída padrão e em adição é executada cmd1
com hello
como entrada.
Por exemplo, se você deseja duplicar a entrada somecommand
e passá-la para ambos cmd1
e 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 .