【问题标题】:Redirecting program output重定向程序输出
【发布时间】:2015-02-27 12:02:09
【问题描述】:

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

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

我试过了

myprogram > file1 2> file2

但这不满足 3 和 4。

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

【问题讨论】:

标签: linux bash unix


【解决方案1】:
(./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 输出,您可以尝试使用unbuffer 运行您的程序,该实用程序可以避免这种缓冲。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好吧,它在 OP 询问的 Linux 上不起作用。奇怪的。我有 Bash 4.1.5,你可能有一个旧的。
    • 我有版本3.2.53
    • 是的,Mac OS 卡在一个非常旧的 Bash 上。
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多