2012-02-04 9 views
5

कई पर्ल स्क्रिप्ट (विशेष रूप से प्रसिद्ध CPAN distros में) मैं कोड का निम्न भाग को खोजने में:पर्ल स्क्रिप्ट में "कुछ खोल के नीचे नहीं चल रहा" का क्या अर्थ है?

eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}' 
if 0; # not running under some shell 

मैं सोच रहा था क्या इसके लिए है?

धन्यवाद।

उत्तर

8

कुछ सिस्टम स्क्रिप्ट की शुरुआत में #!/usr/bin/perl लाइन को नहीं पहचानते हैं, और इसलिए इस तरह के सिस्टम पर नाम से एक पर्ल प्रोग्राम को आमंत्रित करने का प्रयास करने से स्क्रिप्ट को केवल खोल में ही पास किया जाएगा। इसका मुकाबला करने के लिए, पोर्टेबल पर्ल प्रोग्राम एक लाइन से शुरू होते हैं, जब मानक पॉज़िक्स शैल द्वारा व्याख्या की जाती है, तो स्क्रिप्ट को perl(1) पर पास करने का कारण बनता है। if 0 पर्ल द्वारा चलाए जाने पर लाइन को अनदेखा कर देता है, और इसे एक अलग लाइन पर रखकर गोले को एक अलग कमांड के रूप में पेश करने का कारण बनता है, जैसे ही इसे पढ़ा जाता है, केवल eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}' चलाता है।

+0

धन्यवाद, बहुत कुछ! वास्तव में कितना चालाक! –

+1

मुझे आश्चर्य है कि अभी भी ऐसी किसी भी प्रणाली के बारे में चिंता करने योग्य है जो [शेबांग] (http://en.wikipedia.org/wiki/Shebang_ (यूनिक्स) का समर्थन नहीं करता है)। –

+2

मेरे पास स्क्रिप्ट हैं जो ऐसा करते हैं ताकि वे सोलारिस और लिनक्स के तहत चल सकें। शेबांग एक सोलारिस पर्ल को इंगित करता है, लेकिन लिनक्स के तहत स्क्रिप्ट को खोल के रूप में निष्पादित किया जाता है, और eval line एक लिनक्स perl निष्पादित करता है। पर्दे अजीब स्थानों के तहत स्थापित हैं, लेकिन फाइलों/निर्देशिकाओं को एनएफएस के माध्यम से सिस्टम के बीच साझा किया जाता है। – runrig

2

रेखा गोले के साथ ही perl के तहत मान्य है। के कारण eval में छोड़ दिया गया है। खोल में, eval का उपयोग कर perl में एक ही फ़ाइल निष्पादित की जाती है।

+0

हाँ, यह आईडी भी अच्छी स्पष्टीकरण है। एक बार फिर धन्यवाद! –