bash – stdout到file1,stderr到file2,都正确交错到stdout和file
发布时间:2020-12-15 22:40:10 所属栏目:安全 来源:网络整理
导读:鉴于第三方计划,如何同时进行: 将stdout写入z.stdout 将stderr写入z.stderr 适当地传递退出代码 以正确的交错顺序写入stdout 这是我一直在使用的测试程序(delayed_interleaved_stdout_stderr.pl): #!/usr/bin/env perluse strict;use warnings;# fixme: de
鉴于第三方计划,如何同时进行:
>将stdout写入z.stdout 这是我一直在使用的测试程序(delayed_interleaved_stdout_stderr.pl): #!/usr/bin/env perl use strict; use warnings; # fixme: debug,uncomment to force stdout flushing # use English '-no_match_vars'; # $OUTPUT_AUTOFLUSH = 1; # use sleeps to simulate delays and test buffering use Time::HiRes 'sleep'; foreach my $num ( 0..9 ) { if ( 0 == $num % 2 ) { print STDOUT $num,":stdoutn"; } else { print STDERR $num,":stderrn"; } sleep 0.25; } 到目前为止,我已经能够做1,2,3: ( set -o pipefail; ( set -o pipefail; delayed_interleaved_stdout_stderr.pl | tee z.stdout; exit $? ) 3>&1 1>&2 2>&3 | tee z.stderr; exit $? ) 3>&1 1>&2 2>&3 感谢related answer和lhunath以及一位朋友,我将其简化为: delayed_interleaved_stdout_stderr.pl > >(tee z.stdout) 2> >(tee z.stderr >&2) 但是,我无法获得正确的交错顺序. stderr立即打印,并且(推测缓冲的)stdout最后都打印出来. 1:stderr 3:stderr 5:stderr 7:stderr 9:stderr 0:stdout 2:stdout 4:stdout 6:stdout 8:stdout 运行delayed_interleaved_stdout_stderr.pl本身会以正确的0-9顺序显示.强制stdout正确刷新工作(请参阅注释的fixme部分),但我将无法修改真实文件. 也许我错过了一些基本的东西,我开始怀疑这是否可能:( 解决方法
要求4是棘手的. stdout和stderr的缓冲逻辑隐藏在libc中,要更改它,你需要欺骗应用程序认为它正在写入终端.
期待包附带的unbuffer将为您完成此操作.警告:即使写入终端,stdout也是行缓冲的,所以如果你的应用程序没有写完整行,那么这将无效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |