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)
这将返回正确的值.那么我在第一次做错了什么呢?
变量在反引号内插入,因此$?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)