2012-09-08 15 views
6

मैं अपेक्षाकृत पर्ल के लिए नया हूँ और किसी और ने लिखा पर्ल फाइलों पर काम कर रहा हूँ, और मैं स्क्रिप्ट की शुरुआत में निम्नलिखित बयान का सामना कर रखें:लांग eval स्ट्रिंग

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"[email protected]"}' && eval 'exec perl -w -S $0 $argv:q' 
    if 0; 

ये दो पंक्तियां क्या करती हैं? कोड जांच क्या है? और if 0; वाक्य क्या करता है?

उत्तर

8

यह निष्पादन हैक का एक रूप है। कुछ दिनों पहले दुभाषियों को विश्वसनीय रूप से #! के साथ निर्दिष्ट किया जा सकता था, इसका उपयोग शेल निष्पादन perl बनाने के लिए किया गया था। दूसरी पंक्ति पर if 0 कभी भी शैल द्वारा नहीं पढ़ा जाता है, जो केवल पहली पंक्ति को पढ़ता है और निष्पादित करता है, जो if 0 पढ़ता है और स्वयं को फिर से निष्पादित नहीं करता है।

यह एक दिलचस्प संस्करण है, लेकिन मुझे लगता है कि काफी सही नहीं है। ऐसा लगता है कि बोर्न शेल या सीएसएच वेरिएंट के साथ काम करने के लिए प्रारंभिक eval का उपयोग करके इसे खोलने वाले खोल को निर्धारित करने के लिए सेट किया गया है और फिर तर्कों को पार करने के लिए उचित वाक्यविन्यास का उपयोग करना है। मध्य खंड sh वाक्यविन्यास है और अंतिम खंड सीएसएच के लिए उपयुक्त है। यदि दूसरा &&|| था और प्रारंभिक eval '(exit $?0)' वास्तव में सीएसएच में विफल रहा था, तो यह उन लक्ष्यों को पूरा करेगा, लेकिन जैसा कि लिखा है, मुझे नहीं लगता कि यह सीएसएस के लिए काफी काम करता है। क्या कोई ऐसा आदेश है जो इससे पहले है जो $? को खोल के आधार पर कुछ मान पर सेट करेगा? लेकिन अगर यह मामला था और $? गैर-शून्य मान पर सेट है, तो &&|| के साथ प्रतिस्थापित होने तक कुछ भी निष्पादित नहीं किया जाएगा। कुछ मजाकिया हो रहा है।

+0

धन्यवाद! 'Exec हैक 'क्या है? क्या आपका मतलब 'शेबांग' है? –

+0

निष्पादन हैक मूल रूप से ऐसी तकनीक है जो एक शेबांग लाइन का उपयोग करने के बजाय एक विशिष्ट दुभाषिया का आह्वान करने के लिए निष्पादन का उपयोग करती है। –

+0

धन्यवाद! तब समतुल्य 'शेबांग' रेखा क्या होगी? किसी भी तरह यह 'eval' चेक सिर्फ एक विशिष्ट बाइनरी/दुभाषिया का उपयोग करने के लिए पूछने से अधिक जटिल दिखता है। –

संबंधित मुद्दे