在一些Bash单元测试脚本中,我使用以下技巧来记录并显示命令的标准输出和标准错误输出:(可能与某些程序不接受输入文件的进程替换有关)
command > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
这个过程会将一些输出内容输出到标准输出(stdout),所以$stdoutF
文件也会得到一些数据。然后我运行了另一个不会输出任何数据的命令:
diff -r "$source" "$target" > >(tee "${stdoutF}") 2> >(tee "${stderrF}" >&2)
然而,看起来在进行空值测试之前,这个过程并不总是能够成功完成(使用 shunit-ng 进行测试):
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
在进行了 100 次测试中,这个测试失败了 25 次。
在测试文件是否为空之前,调用 sync
是否足够:
sync
assertNull 'Unexpected output to stdout' "$(<"$stdoutF")"
...或者它应该通过强制执行命令序列来工作:
diff -r "$source" "$target" \
> >(tee "${stdoutF}"; assertNull 'Unexpected output to stdout' "$(<"$stdoutF")")
2> >(tee "${stderrF}" >&2)
...是否可以某种方式进行tee
以直接将其断言为空而不是写入文件?
更新:使用sync
并不是答案 - 请参见Gilles的回答。
更新2:讨论进一步发展到Save stdout, stderr and stdout+stderr synchronously。感谢各位回答!