出于测试目的,我想保存stdout和单独标准错误通过后续的代码检查。例如,错误输入的测试运行应该导致输出到标准错误,但没有任何标准输出,而测试运行正确的输入应导致输出到标准输出,但没有标准错误。节省必须是同步的,以避免与测试竞争条件(所以我不能使用process substitution)。保存标准输出,标准错误和标准输出+标准错误同步
为了能够在事后调试测试,我也需要看到stdout和stderr在它们输出的顺序。因此,我必须将它们保存到相同的文件/变量/任何内容,或者将它们同时保存到终端。
要测试发生了哪个错误,我还需要命令的退出代码。
由于效率和准确性的原因,我当然不能每次运行两次测试。
它是例如可能重定向标准输出到stdout.log,stderr到stderr.log,和他们都在同一个命令output.log?或者对stdout和stderr分别使用同步tee
命令?或者保存stdout和stderr的副本来分离变量?
更新:它看起来像Tim的解决方案几乎作品(修改为输出端上,而不是记录到all.log):
$ set -o pipefail
$ {
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
foo
$ cat stderr.log
$ {
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
$ cat stderr.log
foo
$ bar=$({
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ echo "$bar"
foo
$ cat stdout.log
foo
$ cat stderr.log
$ bar=$({
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ cat stdout.log
$ cat stderr.log
foo
$ echo "$bar"
foo
这似乎除了最后一次迭代,其中值工作的bar
被设置为stderr的内容。任何建议所有这些工作?
假设我们正在谈论基于行的字符串,我们可以管两个流通过,说,'sed'在行首添加标记?然后,我们可以从日志文件中知道哪一行来自哪个流。 – Raphael 2017-05-10 09:04:45
@Raphael:你应该能够在每个进程替换内部的'tee'之前,例如:'exec>>(sed's/^/from STDOUT:/'| tee -a mylog)2>>(sed's/^ /来自STDERR:/'| tee -a mylog>&2)'(未经测试)。顺便说一下,这将导致输出到终端的也有这些前缀。 – 2017-05-10 14:24:28
酷!这不会使您给出的部分报价无效吗?现在我们有一个sychronized共享输出文件,并且仍然知道哪个是哪个,或者我错过了什么? – Raphael 2017-05-10 18:20:28