重定向程序输出



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

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

我试过了

myprogram > file1 2> file2

但这并不能满足3和4。

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

(./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 运行程序,这是一个避免这种缓冲的实用程序。

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

还是你认为cat file3在作弊?

最新更新