2011-08-16 19 views
9

वापस करने के लिए पर्ल प्राप्त करना मैं उबंटू 11.04 पर पर्ल 5.10.1 का उपयोग कर रहा हूं। मैं पर्ल को शेल स्क्रिप्ट निष्पादित करना चाहता हूं और शेल स्क्रिप्ट से बाहर निकलने वाले कोड के साथ बाहर निकलना चाहता हूं। लेकिन यह मेरे लिए काम कर रहा है नहीं ...सही निकास कोड

system($runCmd) or die("Failed to run \"$runCmd\": $!"); 

मैं पुष्टि की है कि "$ runCmd" चल रहा है अपने आप में 255 का एक निकास कोड देता है, लेकिन "मर" खंड लागू नहीं हो रही है। मैं सही कोड से कैसे बाहर निकल सकता हूं या कम से कम गैर-सफलता कोडों के लिए असफल हो सकता हूं?

एक और मामूली आवश्यकता यह है कि मैं स्क्रीन पर $ runCmd से आउटपुट चाहता हूं।

उत्तर

8

perldoc -f die कहते हैं, die एक विशिष्ट निकास कोड (केवल एक nonzero निकास कोड) नहीं देता है।

my $exit_code=system($runCmd); 

if($exit_code!=0) 
{ 
    print "Command $runCmd failed with an exit code of $exit_code.\n"; 
    exit($exit_code >> 8); 
} 
else 
{ 
    print "Command $runCmd successful!\n"; 
} 
+8

आपको चाहिए: 'बाहर निकलें ($ exit_code >> 8) '। – ErikR

+0

वह क्यों है, बिल्कुल? –

+3

'सिस्टम()' से वापस दिया गया मान एक पूर्णांक है जो बाल प्रक्रिया के निकास मूल्य को एन्कोड करता है और यह इंगित करता है कि बच्चे की प्रक्रिया कैसे निकलती है (सामान्य समाप्ति, सिग्नल द्वारा मार डाला गया आदि) मूल्य 'निकास () 'सिर्फ बाहर निकलने का मूल्य है। – ErikR

6

यदि system255 देता है, तो आपको and सशर्त की आवश्यकता होती है।

systemसफल निष्पादन पर शून्य लौटाता है। इसके अलावा, die आपकी स्क्रिप्ट के निकास कोड को संशोधित करेगा।

my $output = `$cmd`; 

if ($?) { 
    warn ...; 
    exit $? >> 8; 
} 

बैकटिक ऑपरेटर केवल कब्जा STDOUT, के लिए तो बजाय: warn और इस तरह पिछले बाहर निकलने के कोड को वापस:

system($cmd) and do { 
    warn "Failed to run $cmd. Exit code is $?"; 
    exit $? >> 8; 
}; 

आदेश कार्यक्रम के उत्पादन (`) ऑपरेटर को पकड़ने के लिए, बैकटिक का उपयोग में कब्जा करने के लिए सभी त्रुटि संदेश (जो आमतौर पर STDERR पर जाते हैं) $cmd संशोधित करें और 2>&1 इसमें जोड़ें।

$? वैश्विक पर आठ बिट्स द्वारा बाएं शिफ्ट पर ध्यान दें।


क्रेडिट @musiKk पर जाएँ: perl documentation on system() राज्यों कैसे ठीक वास्तविक बाहर निकलें स्थिति पुनर्प्राप्त करने में।

+3

बस एक अतिरिक्त: आपको '$ cmd' के वापसी मूल्य प्राप्त करने के लिए' सिस्टम 'के वापसी मूल्य को आठ से दाएं स्थानांतरित करना होगा। (http://perldoc.perl.org/functions/system.html) – musiKk

+0

धन्यवाद, @musiKk। मैंने तदनुसार अपना जवाब अपडेट किया। –

4
system($runCmd) or die("Failed to run \"$runCmd\": $!"); 

सबसे पर्ल कार्यों के विपरीत, system रिटर्न झूठी जब यह सफल होता है और सच है जब यह विफल रहता है: आप क्या चाहते हैं पाने के लिए आपको कुछ ऐसा करना होगा। यह पूरी तरह से पीछे की तरफ है, लेकिन मुझे यह पता है कि यह कैसा है।

आपको "सिस्टम() और" नहीं "सिस्टम() या" "की आवश्यकता है। और आप शायद $?$! नहीं चाहते हैं, हालांकि यह कभी-कभी मुश्किल हो सकता है।

मैं

system(...)       && die 

के साथ बहुत कम बचने क्योंकि यह शिकंजा सभी || die के के बाकी है कि सामान्य रूप सही पर एक सतत लंबवत दोहरा मार्जिन से अधिक बनाने के लिए, मैं कभी कभी लिखने

system(...) == 0      || die 

ताकि वे सभी ठीक से फिर से लाइन हो।

0

प्रणाली() के प्रतीयमान पिछड़ेपन आपको परेशान करती हैं, तो आप हमेशा इसे और अधिक की तरह कुछ करने से स्वादिष्ट बना सकते हैं:

my $err = system '/something/that/may/not/work'; 
if ($err) { 
    warn "@{[$! || 'undefined error']}\n"; 
    exit $err >> 8; 
} 

आपका $ runCmd, BTW, अगर यह स्क्रीन करने के लिए प्रिंट (और यह है कमांड लाइन से चलाएं और आपने आउटपुट को रीडायरेक्ट नहीं किया है, आदि) स्क्रीन पर प्रिंट करेंगे। यह सिर्फ आईटी स्क्रीन पर प्रिंट करेगा। पर्ल उस के लिए ज़िम्मेदार नहीं होगा या यह प्रिंट करेगा (या देखभाल)। यदि आप चाहते हैं कि आप चाहते हैं, और आप $ runCmd के आउटपुट को व्यवस्थित रूप से विश्लेषण या कुशल बनाना नहीं चाहते हैं, तो आप सुनहरे हैं। इसे आज़माएं:

perl -e "system 'ls -Fahl'" 

यह आपके $ रनकैम के STDOUT में हस्तक्षेप नहीं करेगा। वह आपके टर्मिनल पर भी जाएगा। उदाहरण के लिए:

$ perl -e "system 'ls -Fahl /dev/null/something' and die qq(fail: $! >> 8 == @{[$! >> 8]})" 
ls: /dev/null/something: Not a directory 
fail: 26205 >> 8 == 102 at -e line 1. 
संबंधित मुद्दे