加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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
>将stderr写入z.stderr
>适当地传递退出代码
>以正确的交错顺序写入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也是行缓冲的,所以如果你的应用程序没有写完整行,那么这将无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读