如何正确捕获unix命令的返回值?

Joe*_*hew 5 shell perl return-value

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

Unix命令:

#nc -z 8.8.8.8 441; echo $?
1
Run Code Online (Sandbox Code Playgroud)

Perl命令:

#perl -e 'my $pstate=`nc -z 8.8.8.8 441; echo $?`; print $pstate;'
0
Run Code Online (Sandbox Code Playgroud)

所以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.
Run Code Online (Sandbox Code Playgroud)

这将返回正确的值.那么我在第一次做错了什么呢?

mob*_*mob 9

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

my $pstate=`nc -z 8.8.8.8 441; echo $?`
Run Code Online (Sandbox Code Playgroud)

是指Perl $?,而不是shell $?.壳看到的是什么

nc -z 8.8.8.8 441 ; echo 0
Run Code Online (Sandbox Code Playgroud)

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

my $pstate=`nc -z 8.8.8.8 441; echo \$?`;
Run Code Online (Sandbox Code Playgroud)

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

my $pstate=qx'nc -z 8.8.8.8 441; echo $?';
Run Code Online (Sandbox Code Playgroud)

或使用readpipe非插值报价结构

my $pstate= readpipe( 'nc -z 8.8.8.8 441; echo $?' );
my $pstate= readpipe( q{nc -z 8.8.8.8 441; echo $?} );
Run Code Online (Sandbox Code Playgroud)