将Bash输出导向两个不同的流

3

我有一个bash脚本,它通过ssh在两台不同的计算机上生成进程,并将其中一个的输出导入到文本文件中。如何在终端中实时显示运行过程中的输出?

2个回答

6

请查看tee实用工具(man tee)。


而要用tee来完成这个操作,你只需输入最简单的命令 cat output|tee filename - Kimvais
1
不要忘记标准错误:cat output 2>&1 | tee filename - Harvey
什么?...你能解释一下那行代码吗?我在使用Bash时有些抠门 :-p - Ritwik Bose
第一行 cat output | tee filename 只会捕获常规输出。如果您的程序使用标准错误处理错误,您将在屏幕上看到这些错误,但它们不会进入文件,除非您在管道前加上 2>&1,告诉 shell 将所有标准错误重定向到标准输出。 - Harvey

4

tee命令在你想要将一个流保存到文件并继续处理它的时候非常有用。然而,如果你想要将stdout发送到两个不同的程序中,你可以使用while read循环,并将输出回显到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:输入
STDOUT: 1:输入

注意 - while/read/echo 的方法可能无法保留换行符和二进制文本,并且过长的行会导致问题。与许多事物一样,bash 可能不是最佳解决方案。以下是一个适用于除了非常大的文件之外的所有情况的 Perl 解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接