繁体   English   中英

在更新的Perl中使用Perl IPC :: Open3捕获输出,错误和退出代码失败

[英]Capturing output, error and exit code with Perl IPC::Open3 fails in newer Perl

我有一个使用IPC :: Open3的小子程序 (通常使用Capture :: Tiny ),因为我只想使用核心Perl模块。 此子例程是较大的安装脚本的一部分。 它捕获命令输出,错误和退出代码。 它可以在带有Perl 5.10.1(IPC :: Open3 1.04)的Centos 6(和5)上运行,但是在带有Perl 5.18.1(IPC :: Open3 1.13)的Ubuntu 14 LTS上却无法使用。 有人可以向我解释为什么它在较新的Perl上失败以及如何解决。

sub _capture_output {
    croak( '_capture_output() needs a $cmd and options' ) unless (@_ ==  2);
    my ($cmd, $param_href) = @_;

    my $verbose = defined $param_href->{verbose}  ? $param_href->{verbose}  : 0;   #default is silent
    print "Report: COMMAND is: $cmd\n" if $verbose;

    local $| = 1;   #autoflush
    my ( $in, $out, $err );
    open my ($in_fh),  '<', \$in;
    open my ($out_fh), '>>', \$out;
    open my ($err_fh), '>>', \$err;

    my $pid = open3($in_fh, $out_fh, $err_fh, $cmd);

    my $stdout = $out;
    my $stderr = $err;
    $stdout = '' if !defined $stdout;
    $stderr = '' if !defined $stderr;

    waitpid( $pid, 0 ) or die "$!\n";
    my $exit =  $? >> 8;

    if ($verbose == 2) {
        print 'STDOUT is: ', "$stdout", "\n", 'STDERR  is: ', "$stderr", "\n", 'EXIT   is: ', "$exit\n";
    }

    return  $stdout, $stderr, $exit;
}

它无法通过open3调用在线并出现错误:

Report: COMMAND is: plenv --version
Uncaught exception from user code:
open3: exec of plenv --version failed at ./Perlinstall.pm line 175.
IPC::Open3::_open3('open3', 'GLOB(0x27819a0)', 'GLOB(0x2781730)', 'GLOB(0x2781b68)', 'plenv --version') called at /usr/share/perl/5.18/IPC/Open3.pm line 250

当我在命令行上尝试此命令时,我得到相同的错误代码,但错误不同。 Centos6:

$ plenv --version
-bash: plenv: command not found
$ echo $?
127

Ubuntu14:

$ plenv --version
No command 'plenv' found, did you mean:
Command 'p7env' from package 'libnss3-tools' (main)
plenv: command not found
$ echo $?
127

目前尚不清楚您认为问题出在open3 ,但open3的行为与所记录的一样。

它不会在失败时返回:它只会引发与/ ^ open3:/匹配的异常。

您尝试执行的程序不存在,因此open3引发异常。 我认为您想知道为什么$? 没有设置,为什么在$stderr的句柄中什么也没打印,但这并不奇怪,因为程序从未运行过。

请记住,如果命令是一个除空格之外没有其他外壳字符的字符串,则exec (由open3 )将绕过外壳,因此执行该命令会得到不同的结果

plenv --version         
# Same as: open3(..., ..., ..., 'plenv', '--version')
# Exception: Can't find plenv

plenv '--version'
# Same as: open3(..., ..., ..., '/bin/sh', '-c', q{plenv '--version'})
# Shell exits with an error in ($? >> 8)

您可以使用eval BLOCK捕获异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM