Você pode especificar vários nomes de arquivos para tee
e, além disso, a saída padrão pode ser canalizada em um comando. Para despachar a saída para vários comandos, você precisa criar vários canais e especificar cada um deles como uma saída de tee
. Existem várias maneiras de fazer isso.
Substituição de processos
Se o seu shell é ksh93, bash ou zsh, você pode usar a substituição do processo. Esta é uma maneira de passar um pipe para um comando que espera um nome de arquivo. O shell cria o pipe e passa um nome de arquivo como /dev/fd/3
para o comando. O número é o descritor de arquivo ao qual o pipe está conectado. Algumas variantes unix não suportam /dev/fd
; Nesses, um pipe nomeado é usado no lugar (veja abaixo).
tee >(command1) >(command2) | command3
Descritores de arquivos
Em qualquer shell POSIX, você pode usar vários descritores de arquivos explicitamente. Isso requer uma variante unix que suporte /dev/fd
, uma vez que todas, exceto uma das saídas de tee
, devem ser especificadas pelo nome.
{ { { tee /dev/fd/3 /dev/fd/4 | command1 >&9;
} 3>&1 | command2 >&9;
} 4>&1 | command3 >&9;
} 9>&1
pipes nomeados
O método mais básico e portátil é usar pipes nomeados . A desvantagem é que você precisa encontrar um diretório gravável, criar os canais e limpar depois.
tmp_dir=$(mktemp -d)
mkfifo "$tmp_dir/f1" "$tmp_dir/f2"
command1 <"$tmp_dir/f1" & pid1=$!
command2 <"$tmp_dir/f2" & pid2=$!
tee "$tmp_dir/f1" "$tmp_dir/f2" | command3
rm -rf "$tmp_dir"
wait $pid1 $pid2