重定向程序输出

Redirecting program output

如何重定向我的程序,以便输出到 3 个文件,这样

  1. stdout 转到文件 1
  2. stderr 转到文件 2
  3. stdout 和 stderr 的组合结果以其原始顺序进入 file3
  4. 重定向时,输出也会打印到屏幕上,因为程序是 运行

我试过了

myprogram > file1 2> file2

但这不满足3&4

编辑:如果屏幕在消息打印后立即显示会更好。 (以提高响应速度)

myprogram > file1 2> file2 &> file3; cat file3

或者你认为cat file3是作弊?

(./foo.sh > >(tee out.log) 2> >(tee err.log >&2)) |& tee all.log

我们在这里做了什么?首先,我们为 运行 tee out.logtee err.log 创建两个子 shell,并将适当的描述符重定向到它们。我们小心地将 stdouterr.log 重定向回它所属的 stderr,否则它会弄乱 out.log(这个想法归功于 )。其次,我们将整个东西放在一个子外壳中,以便我们可以一次性将其 stdoutstderr 重定向到 all.log,再次使用 tee 打印到屏幕上同时。

需要注意的是,我们 运行ning 的程序在不是 TTY/PTY(终端设备)时可能会缓冲 stdout。如果您需要 stdout 在您的屏幕和文件中立即输出,您可以尝试 运行 使用 unbuffer 连接您的程序,这是一个避免这种缓冲的实用程序。