在perl中捕获shell退出代码

时间:2013-04-16 14:28:42

标签: perl

我正在使用perl使用open 3

执行shell命令
   local ( *HANDLE_IN, *HANDLE_OUT, *HANDLE_ERR );

    my $pid = open3( *HANDLE_IN, *HANDLE_OUT, *HANDLE_ERR, @cmd_args ); 

其中@cmd_args =我的shell命令

我的shell返回退出代码

0: command executed successfully

>0: error in executing the command

如何在perl中捕获shell中的退出代码?

2 个答案:

答案 0 :(得分:4)

这很简单,只需看看the good old perldoc

$pid = open3(\*CHLD_IN, \*CHLD_OUT, \*CHLD_ERR,
    'some cmd and args', 'optarg', ...);

my($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
    'some cmd and args', 'optarg', ...);

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

$child_exit_status然后包含已执行程序的状态。

另一种使用的方法是${^CHILD_ERROR_NATIVE}我正在使用它,特别是在通过反引号执行外部命令时:

my $fancyresult = `ls -lsahR /`;

if (${^CHILD_ERROR_NATIVE} != 0) {
    ...

答案 1 :(得分:2)

您最终需要使用waitwaitpid收获孩子。执行此操作后,$?将设置如下。

waitpid($pid, 0);
die "Can't waitpid: $!" if $? < 0;
die "Child killed by signal ".( $? & 0x7F ) if $? & 0x7F;
die "Child returned error ".( $? >> 8 ) if $? >> 8;
print "Child ran successfully!\n";  # if $? == 0