重定向程序输出

时间:2015-01-12 00:04:25

标签: linux bash unix

如何重定向程序,以便输出转到3文件

  1. stdout转到file1
  2. stderr转到file2
  3. stdout和stderr的组合结果按原始顺序转到file3
  4. 重定向时,输出也会在程序运行时打印到屏幕上
  5. 我试过

    myprogram > file1 2> file2
    

    但这并不满足3& 4。

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

2 个答案:

答案 0 :(得分:3)

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

我们在这做了什么?首先,我们创建两个子shell来运行tee out.logtee err.log,并将适当的描述符重定向到它们。我们会谨慎地将stdouterr.log重定向回其所属的stderr,否则会导致out.log陷入困境(此问题归功于https://stackoverflow.com/a/692407/4323)。其次,我们将整个内容放在子shell中,以便我们可以将stdoutstderr一次性重定向到all.log,再次使用tee打印到屏幕上同时。

有一点需要注意,我们正在运行的程序很可能在它不是TTY / PTY(终端设备)时缓冲stdout。如果您需要在屏幕上和文件中立即从stdout输出,您可以尝试使用unbuffer运行程序,该实用程序可以避免此缓冲。

答案 1 :(得分:0)

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

或者你认为cat file3是在作弊?