5

我无法将 unix 命令的返回值转换为 perl 变量。

Unix命令:

#nc -z 8.8.8.8 441; echo $?
1

Perl 命令:

#perl -e 'my $pstate=`nc -z 8.8.8.8 441; echo $?`; print $pstate;'
0

那么perl命令似乎得到了“无错误”的返回值?如何正确捕获 *nix 命令的返回值?

另一个例子:

#perl -e 'my $pstate=`ping -v 8.8.8.8 -c 1`; print $pstate;'
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

这将返回正确的值。那么我首先做错了什么?

4

2 回答 2

9

变量在反引号内插值,因此$?in

my $pstate=`nc -z 8.8.8.8 441; echo $?`

指 Perl 的$?,而不是 shell 的$?. 外壳看到的是类似的东西

nc -z 8.8.8.8 441 ; echo 0

要解决此问题,您可以转义 shell 命令

my $pstate=`nc -z 8.8.8.8 441; echo \$?`;

或使用qx带有单引号的运算符作为分隔符(这是“qx运算符内插值”规则的一个例外)

my $pstate=qx'nc -z 8.8.8.8 441; echo $?';

readpipe与非插值报价结构一起使用

my $pstate= readpipe( 'nc -z 8.8.8.8 441; echo $?' );
my $pstate= readpipe( q{nc -z 8.8.8.8 441; echo $?} );
于 2013-08-14T05:21:54.453 回答
1

另一种方法是使用IPC::Run3,它“允许您运行子进程并将标准输入、标准输出和/或标准错误重定向到文件和 perl 数据结构”。

与系统类似,您可以检查 $? 之后以各种方式,包括移动 8 以获得实际的退出代码,如下所示:

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;
}

此块取自http://perldoc.perl.org/functions/system.html此处的系统文档,其中还提到了devnull所说的内容。每当我关心的不仅仅是 qx 或系统的一件事时,我都会切换到 IPC::Run3,因为它可以轻松获取所有内容。

于 2013-08-15T04:50:22.093 回答