如果有任何内容写入STDERR,我如何运行系统命令并死掉?

Dav*_*d B 1 perl system die stderr

我正在编写一个使用外部脚本的Perl脚本.外部脚本必须从特定目录运行,因此我发现以下内容非常有用:

use IPC::System::Simple qw(capture);

my @args = ('external script path...', 'arg1', ...);
my $out = capture( [0], "cd $dir ; @args" );
Run Code Online (Sandbox Code Playgroud)

有时外部脚本会将内容写入STDERR,但仍会返回0.我希望捕获这些时间和confess(或die).由于我不控制外部脚本的返回值,我想也许我可以捕获它的STDERR所以我会有这样的东西:

my ($out, $err) = cool_capture( [0], "cd $dir ; @args" );
say "Output was: $out";
if ($err) {
 die "Error: this was written to STDERR: $err";
}
Run Code Online (Sandbox Code Playgroud)

我能做什么?

Sor*_*gal 6

这在Perl FAQ中有所介绍.

假设test_app是一个程序,它向stdout输出一行,向stderr输出一行:

use IPC::Open3;
use Symbol 'gensym';

my($wtr, $rdr, $err);
$err = gensym;

my $pid = open3($wtr, $rdr, $err, 'test_app');

waitpid($pid, 0);
my $status = $? >> 8;

my $stdout = <$rdr>;
my $stderr = <$err>;

print "out output: $stdout\n";
print "err output: $stderr\n";

print "Exit code: $status\n";
Run Code Online (Sandbox Code Playgroud)

编辑:根据更新的请求包括捕获退出代码.你也可以问过perldoc IPC::Open3哪个说

waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
Run Code Online (Sandbox Code Playgroud)

无论如何你应该阅读它的警告和警告.