合并 stdout 和 stderr,并分别创建每个的副本

合并 stdout 和 stderr,并分别创建每个的副本

我的目标最好通过例子来解释。首先,这是一个将在 stdout 和 stderr 上生成示例输出的函数:

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

如果您单独运行它,两个流都将按执行顺序打印到终端:

$ output
1
2
errA
errB
3
4

现在这个函数只是一个占位符,代表我们希望记录的任意脚本的输出(stdout 和 stderr)。具体来说,我们要创建三个不同的日志:

  1. stdout 和 stderr 的组合执行顺序输出(即上面的输出)。
  2. 只是标准输出
  3. 只是 stderr 输出

我想出的最接近的解决方案是:

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

正如您所看到的,outerr文件是所需的,但组合后的文件both不保持执行顺序。

有没有办法同时创建 3 个所需的日志文件?

output作为一个额外的问题,当函数单独运行时,执行顺序输出是否真的得到保证?我尝试运行多次,终端中的混合 stdout 和 stderr 始终相同,并且顺序正确。但这与保证不同。

相关内容