bash – 同步保存stdout,stderr和stdout stderr
出于测试目的,我想分别保存stdout和stderr以供后续代码检查.例如,错误输入的测试运行应该导致输出到stderr,但是stdout没有输出,而具有正确输入的测试运行应该导致输出到stdout,但是没有输出到stderr.保存必须是同步的,以避免测试的竞争条件(所以我不能使用
process substitution).
为了能够在事后调试测试,我还需要在输出的序列中看到stdout和stderr.所以我必须将它们保存到同一个文件/变量/中,或者同时将它们发送到终端,以便单独保存它们. 为了测试发生了哪个错误,我还需要命令的退出代码. 出于效率和准确性的原因,我当然不能每次测试两次. 例如,可以将stdout重定向到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的内容.有关所有这些工作的建议吗?
请看
BashFAQ/106.吃蛋糕也不容易吃.
从那个页面:
# Bash > mylog exec > >(tee -a mylog) 2> >(tee -a mylog >&2) echo A >&2 cat file echo B >&2
~$./foo A hi mom B ~$cat mylog A hi mom B ~$./foo A hi mom ~$B 另请参见BashFAQ/002和BashFAQ/047. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |