希望从通过Perl中的open执行的命令中获取模具错误消息

希望从通过Perl中的open执行的命令中获取模具错误消息,perl,perltk,Perl,Perltk,我正在尝试出一个cmd,如下所示 my $h = IO::Handle->new; $self->{-handle} = $h; die "IO::Handle->new failed." unless defined $h; $self->{-pid} = open $h, $self->{-command} . ' 2>&1 |'; $self->fileevent($h, 'readable' => [\&_read_cmd

我正在尝试出一个cmd,如下所示

my $h = IO::Handle->new;
$self->{-handle} = $h;

die "IO::Handle->new failed." unless defined $h;
$self->{-pid} = open $h, $self->{-command} . ' 2>&1 |';
$self->fileevent($h, 'readable' => [\&_read_cmd_op, $self]);

sub _read_cmd_op{
    my $h = $self->{-handle};
    if ( sysread $h, $_, 4096 ) {
        my $t = $self->Subwidget('text');
        $t->insert('end', $_);
        $t->yview('end');
    } else {
        $self->{-finish} = 1;
    }
}
现在的问题是,$self{-command}正在调用 另一个perl脚本,如果死亡,我想知道。

注意,即使cmd死了,$self{-pid}仍然存在

上面的代码在Perl/TK应用程序中,其中$self->{command}o/p在 文本小部件

不知何故,即使在测试小部件中,我也没有收到死亡消息。 我在电视上看到了

2个问题

  • 如何在文本小部件中获取cmd op/error?

  • 我如何知道通过IO::Handle触发的命令已失效?


  • $self->{-pid}
    只是分叉进程的pid,而不是一些在命令退出时消失的神奇对象

    我无法重现未获得
    die()
    消息时出现的问题。如果使用
    'perl-e“die 123”
    调用上述代码段,则文本小部件中会出现“123”(至少在Unix系统上是这样)

    要获取退出代码,您可以使用如下内容

    } else {
        $mw->fileevent($h, 'readable', '');
        my $pid = waitpid($self->{-pid},0);
        warn "pid $pid finished";
        warn "retcode is " . ($? >> 8);
        $self->{-finish} = 1;
    }
    

    带有空回调的
    fileevent
    调用将在此文件句柄上进一步选择停止。通过waitpid调用,您可以等待子进程的终止。一旦发生这种情况,退出代码在
    $?
    变量中可用,就像在正常的
    system()
    调用之后一样。因此,对于非零退出代码,您知道该命令已终止或退出时的值为假。

    谢谢Slaven。我正在将错误消息发送到文本小部件。我的cmd错误是有一个“T”,所以stderr已经被过滤了。但是我得到了retcode=0。我会做更多的研究。管道的返回值来自链中的最后一个命令。比较
    false;echo$?
    vs.
    false | tee;echo$?