linux - 重定向程序输出

标签 linux bash unix

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

  1. stdout 转到 file1
  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

我们在这里做了什么?首先,我们创建两个子 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 运行您的程序。 ,一种避免这种缓冲的实用程序。

关于linux - 重定向程序输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27893573/

相关文章:

php - 在 ubuntu 13.10 上安装 laravel

node.js - kurento - docker 的 npm 安装错误

bash - 理解词法范围——维基百科是否正确?

bash - 从多个文件添加列的简单方法

unix - 从命令行 unix 查找和替换

linux - 如何从 HDI 集群获取工作线程数、核心数、内存数

Linux,用进程存储凭据,它的 child ,孙子?

bash - 有没有一种优雅的方式来存储和评估 bash 脚本中的返回值?

linux - 使用 AWK、Join 等在 unix 中的两个文件之间进行自然连接

c - 编写一个make文件来编译一个项目,该项目的源代码和头文件位于不同的目录中