Eu quero fazer algo assim:
echo 'foo' | tee /dev/stdout > >(cat)
de onde o stdout echo
é enviado para o terminal e para o processo cat. Existe uma maneira mais simples de fazer isso?
Quando eu executo isso:
echo 'foo' | tee >(echo 'bar')
por algum motivo, ele não ecoa 'foo', apenas ecoa 'bar', por quê?
Você faz exatamente da maneira que você mostrou:
A saída de
somecommand
seria escrita na entrada deothercommand
e na saída padrão.O problema com sua
echo 'bar'
substituição de processo é que ele não se importa com a entrada que vemtee
deecho 'foo'
, então ele apenas saibar
o mais rápido possível e termina. Otee
utilitário então tenta gravar nele, mas falha e, portanto, termina (de receber umPIPE
sinal) antes de gravar a string na saída padrão. Ou,tee
pode ter tempo para gravar os dados no processo de substituição, caso em que ambosbar
efoo
seriam impressos na saída padrão, não é determinístico.Você precisa ter certeza de que o comando na substituição do processo realmente lê os dados enviados para ele ( caso contrário, qual seria o objetivo de enviar dados?) substituição de processo simplesmente use
cat >/dev/null
(supondo que você não esteja interessado nos dados provenientes detee
):ou
(essas duas variações variam apenas na ordem da saída final das duas strings)
A resposta aceita não ficou muito clara para mim, pois o resultado é canalizado para
/dev/null
, obscurecendo se o canal funcionou.Para praticar a confirmação de que o valor foi passado, você pode
cat
usar ou usartr
o valor canalizado como este: