2015-01-12 94 views
1

如何重定向我的程序,从而使输出为3档,使得重定向程序输出

  1. 标准输出去到file1
  2. 标准错误去到file2
  3. 输出和错误的综合结果去在其原始为了FILE3
  4. 虽然重定向,输出也输出到屏幕作为在程序运行

我试图

myprogram > file1 2> file2 

但这并不满足3 & 4.

编辑:这将是更好的,如果在屏幕上显示在打印后立即的消息。 (提高响应能力)

+0

可能的重复[如何在使用管道使用“tee”时将stderr写入文件?](http://stackoverflow.com/questions/692000/how-do-i-write-stderr-to- a-file-while-using-tee-with-a-pipe) –

回答

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

我们在这里做了什么?首先,我们创建两个子壳以运行tee out.logtee err.log,并将相应的描述符重定向到它们。我们很谨慎地将stdouterr.log重新导向stderr它所属的地方,否则它会搞砸out.log(因为这个想法而信贷给https://stackoverflow.com/a/692407/4323)。其次,我们将整个东西放在一个子外壳中,以便我们可以将其stdoutstderr一次性重定向到all.log,同样使用tee同时打印到屏幕上。

一个警告是,我们正在运行的程序可能缓冲标准输出,当它不是一个TTY/PTY(终端设备)。如果您需要在屏幕上和文件中立即输出stdout,则可以尝试使用unbuffer运行程序,该程序可避免此缓冲。

0

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

或者你认为cat file3是欺骗?

+2

这根本不起作用,因为'&>'撤销'>'和'2>'。 –

+0

它在我的Mac上运行得很好。 – user14717

+0

那么它不适用于OP询问的Linux。奇怪。我有Bash 4.1.5,你可能有一个更老的。 –