我的目标最好通过例子来解释。首先,这是一个将在 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)。具体来说,我们要创建三个不同的日志:
- stdout 和 stderr 的组合执行顺序输出(即上面的输出)。
- 只是标准输出
- 只是 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
正如您所看到的,out
和err
文件是所需的,但组合后的文件both
不保持执行顺序。
有没有办法同时创建 3 个所需的日志文件?
output
作为一个额外的问题,当函数单独运行时,执行顺序输出是否真的得到保证?我尝试运行多次,终端中的混合 stdout 和 stderr 始终相同,并且顺序正确。但这与保证不同。