2013-08-14 17 views
5

Bir unix komutunun dönüş değerini bir perl değişkenine almakta sorun yaşıyorum.Bir unix komutunun dönüş değeri nasıl doğru olarak alınır?

Unix komut:

#nc -z 8.8.8.8 441; echo $? 
1 

Perl komut:

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

Yani perl komutu "Hatasız" bir dönüş değeri elde görünüyor? * Nix komutunun dönüş değerini düzgün bir şekilde nasıl kaydedebilirim?

başka bir örneği:

#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. 

Bu, uygun bir değer verir. Yani ilk durumda ne yapıyorum?

cevap

9

değişkenler ters tırnakların içinde interpole edilir, bu nedenle $?

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

Perl en $? belirtir, Kabuksuz en $?. Ya kabuk görür Bunu düzeltmek için

nc -z 8.8.8.8 441 ; echo 0 

gibi bir şey, bu kabuk komutunu

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

kaçabilir ya bu bir istisna değildir (ayırıcı olarak tek bir teklifle qx operatörü kullanmaktır "qx operatör içi interpolasyon" kuralı) için

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

veya olmayan interpolated alıntı yapılmasıyla readpipe kullanmak siyon

my $pstate= readpipe('nc -z 8.8.8.8 441; echo $?'); 
my $pstate= readpipe(q{nc -z 8.8.8.8 441; echo $?}); 
+0

+1 readpipe için –

+0

Ah. Tek tırnakların '' – Droidzone

+0

'dan kaçacağını farz ettim, bunlar tek tırnaklardan farklı olan backticks. – mob

1

Bunu yapmanın bir başka yolu "Bir alt işlemi çalıştırmak ve dosya ve perl veri yapıları Stdin'i, stdout'u ve/veya stderr'yi yönlendirmek için izin verir" hangi IPC::Run3 kullanmaktır.

Sisteme benzer bir şekilde, $ 'ı inceleyebilirsiniz? sonradan böyle fiili çıkış kodu almak için 8 ile değişen dahil olmak üzere çeşitli şekillerde:

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

Bu blok ayrıca devnull söylediklerini bahseder burada sistem dokümantasyonu http://perldoc.perl.org/functions/system.html alınır. Herzaman, qx veya sistemin IPC :: Run3'e geçtiğim tek şeyden çok umurumda olursunuz, çünkü her şeyi elde etmeyi kolaylaştırır.

İlgili konular