【发布时间】:2015-02-27 12:02:09
【问题描述】:
如何重定向我的程序,以便输出到 3 个文件,这样
- stdout 转到 file1
- stderr 转到 file2
- stdout 和 stderr 的组合结果按原始顺序转到 file3
- 重定向时,输出也会在程序运行时打印到屏幕上
我试过了
myprogram > file1 2> file2
但这不满足 3 和 4。
编辑:如果屏幕在打印后立即显示消息会更好。 (提高响应能力)
【问题讨论】:
如何重定向我的程序,以便输出到 3 个文件,这样
我试过了
myprogram > file1 2> file2
但这不满足 3 和 4。
编辑:如果屏幕在打印后立即显示消息会更好。 (提高响应能力)
【问题讨论】:
(./foo.sh > >(tee out.log) 2> >(tee err.log >&2)) |& tee all.log
我们在这里做了什么?首先,我们创建两个子shell 来运行tee out.log 和tee err.log,并将适当的描述符重定向到它们。我们小心地将stdout从err.log重定向回它所属的stderr,否则它会搞砸out.log(这个想法归功于https://stackoverflow.com/a/692407/4323)。其次,我们把整个东西放在一个子shell中,这样我们就可以将它的stdout和stderr一次性重定向到all.log,再次使用tee同时打印到屏幕上。
需要注意的是,当我们运行的程序不是 TTY/PTY(终端设备)时,它可能会缓冲标准输出。如果您需要在屏幕和文件中立即从stdout 输出,您可以尝试使用unbuffer 运行您的程序,该实用程序可以避免这种缓冲。
【讨论】:
myprogram > file1 2> file2 &> file3; cat file3
或者你认为cat file3 是在作弊?
【讨论】:
3.2.53。