bash - 如何在保持流分离的同时将 stdout+stderr 重定向到一个文件?

标签 bash shell unix zsh tee

重定向 stdout+stderr 使得两者都被写入文件,同时仍然输出到 stdout 非常简单:

cmd 2>&1 | tee output_file

但是现在来自 cmd 的 stdout/stderr 都出现在 stdout 上。我想将 stdout+stderr 写入同一个文件(假设 cmd 是单线程的,因此保留顺序)但仍然能够单独重定向它们,如下所示:

some_magic_tee_variant combined_output cmd > >(command-expecting-stdout) 2> >(command-expecting-stderr)

因此 combined_output 包含保留顺序的两者,但 command-expecting-stdout 仅获取 stdout 而 command-expecting-stderr 仅获取 stderr。基本上,我想记录 stdout+stderr,同时仍然允许 stdout 和 stderr 被单独重定向和管道传输。 T 型方法的问题在于它将它们组合在一起。有没有办法在 bash/zsh 中做到这一点?

最佳答案

据我所知,这就是您要找的东西。首先,我制作了一个小脚本来写入 stdout 和 stderr。它看起来像这样:

$ cat foo.sh 
#!/bin/bash

echo foo 1>&2
echo bar

然后我这样运行它:

$ ./foo.sh 2> >(tee stderr | tee -a combined) 1> >(tee stdout | tee -a combined)
foo
bar

我的 bash 中的结果如下所示:

$ cat stderr
foo
$ cat stdout 
bar
$ cat combined 
foo
bar

请注意,-a 标志是必需的,这样 tee 就不会覆盖其他 tee 的内容。

关于bash - 如何在保持流分离的同时将 stdout+stderr 重定向到一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12517519/

相关文章:

linux - BASH 嵌套进程替换

linux - Bash 确定操作系统是 OEL 5 还是 OEL 6 的方法?

linux - 与 *nix 的 Prepar3d/Microsoft Flight Simulator 交谈

c - 小C程序的结果

linux - 使用特定单词 linux 过滤文件

string - 为什么 base64 在 Mac 上对我的文件进行编码不会生成正确的 base64 字符串?

linux - 如何使用 sed 删除从第一行开始到遇到模式 '[ERROR] -17-12-2015' 之前的行?

linux - 以更好的方式分配变量值

git - 如何更改 Shell 脚本中的目录?

C套接字从接受返回的文件描述符中获取IP地址