管道bash输出到两个不同的流

时间:2010-02-15 07:21:04

标签: bash pipe

我有一个bashscript,它通过ssh在两台不同的机器上生成进程,然后cat将一个输出生成一个文本文件。如何在终端显示输出时显示输出?

2 个答案:

答案 0 :(得分:6)

查看tee实用程序(man tee)。

答案 1 :(得分:4)

如果要将流保存到文件并继续处理,tee命令很棒。但是,如果要将stdout发送到两个单独的程序,可以使用while读取循环并将输出回显到stdout和stderr,然后将stdout传递给一个程序,将stderr传递给另一个程序。

echo input | 
  while read foo; do
    echo "$foo"
    echo "$foo" >&2
  done 2> >( command1 1>&2 ) | command2

这是一个演示,其中字符串“input”前面带有一个数字,用于显示输出的位置,然后作为输入发送到两个只添加流名​​称的perl程序。

echo input | 
  while read foo; do
    echo "1: $foo"
    echo "2: $foo" >&2
  done 2> >( perl -wpe 's//STDERR: /;' 1>&2) | perl -wpe 's//STDOUT: /;'

输出

STDERR: 2: input
STDOUT: 1: input

警告 - while / read / echo事物可能不会保留行结尾和二进制文本,而长行会导致问题。与许多事情一样,bash可能不是最好的解决方案。这是一个perl解决方案,除了非常大的文件之外的任何东西:

echo input | 
  perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2