我正在尝试理解别人编写的Perl脚本。我不理解脚本中使用$?
的用途。有人能解释一下下面一行的目的吗?
system( "perform_task.sh", "-param1");
if( ( $? >> 8 ) != 0 ) {
print( "perform_task.sh failed " );
}
我正在尝试理解别人编写的Perl脚本。我不理解脚本中使用$?
的用途。有人能解释一下下面一行的目的吗?
system( "perform_task.sh", "-param1");
if( ( $? >> 8 ) != 0 ) {
print( "perform_task.sh failed " );
}
要查找任何变量的含义,您可以在命令行上键入
$ perldoc -v '$?'
对于相对较新的Perl版本,或者扫描安装在计算机上的perldoc perlvar
,通常最好阅读您所拥有的特定版本的perl
文档,但在紧急情况下,记住由于版本差异可能出现的任何问题,在线版本也可以使用:perldoc -v '$?':
wait()
或waitpid()
的成功调用,或者system()
运算符返回的状态。这只是传统Unix wait()
系统调用返回的16位状态字(否则就是虚构的)。因此,子进程的退出值实际上是($? >> 8)
,$? & 127
指示进程死亡时使用了哪个信号(如果有),而$? & 128
报告是否有核心转储。perldoc -f system的文档中可以找到更多信息:
如果您想手动检查“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;
}
use English;
命令用于设置变量名为英文。 $?
的英文名称是 $CHILD_ERROR
,它包括子进程的退出状态和可能导致其退出的信号编号。请参阅 perldoc perlvar
。
$? 是子进程(perform_task.sh)的错误代码。
在您的脚本中,返回代码向右移动了八位,并将结果与0进行比较。这意味着仅当返回的代码> 255时,运行才被视为失败。
$?
包含 POSIX wait()
函数返回的完整 16 位状态,其中包括进程的返回代码和杀死它的信号编号(如果有)。如果返回代码为非零,则测试失败。 - friedo