system()返回的值是否与" $?"?相同?

时间:2016-03-21 20:40:46

标签: perl

当我在Perl中进行system()次调用时,我通常会根据perldocs检查返回码。 嗯,我是这么认为的。大多数时候$rc!=0对我来说已经足够了。最近我帮助了两个在apache下运行.cgi脚本时遇到system()调用问题的人。我指示他们检查$rc

my $rc = system(...);

并将它们与system()文档相关联。然后我仔细观察并注意到文档并没有真正谈论$rc,而是关于$?而我感到有点尴尬,并且出现了以下问题:

之间是否存在差异:

system(...);
if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
    printf "child died with signal %d, %s coredump\n",
        ($? & 127),  ($? & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $? >> 8;
}

my $rc = system(...);
if ($rc == -1) {
    print "failed to execute: $!\n";
}
elsif ($rc & 127) {
    printf "child died with signal %d, %s coredump\n",
        ($rc & 127),  ($rc & 128) ? 'with' : 'without';
}
else {
    printf "child exited with value %d\n", $rc >> 8;
}

或者,简而言之,$rc的{​​{1}}等于$?

我查看了systemwait$?的文档,但对我来说并不是很清楚。过去15年我使用system()做错了吗?

1 个答案:

答案 0 :(得分:11)

是的,system 的返回值应等于$?

但是,由于$? 适用于system次调用而$?是全局变量,因此可能会被正在发生的其他操作覆盖。来自perldoc -v '$?',其中包括:

  

$ CHILD_ERROR

     

$?

     

最后一个管道关闭,反引号("``")命令返回的状态,成功调用" wait()"或" waitpid()",或来自" system()"操作

立即存储值然后比较更安全:

my $rc = system('ls myfile.txt');
if ( $rc >> 8 != 0 ) {
   # do something because ls exited with an error
}