想要从Perl中通过open执行的命令中获取die错误消息

时间:2014-03-28 07:37:34

标签: 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_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 in a 文本小部件。

不知怎的,即使在测试小部件中我也没有得到消息。 我在stdout上看到它。

2个问题

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

  2. 我怎么知道通过IO :: Handle发出的命令死了?

1 个答案:

答案 0 :(得分:1)

$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()调用之后。因此,对于非零退出代码,您知道命令以虚假值死亡或退出。