当我在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}}等于$?
?
答案 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
}