2011-09-30 7 views
8

जाहिर है इस अजगर, बैश, श, आदि पर्ल के लिए प्रतिस्थापित के साथ समान रूप से लागू होता है! नीचेस्क्रिप्टिंग करते समय, #!/Usr/bin/perl और #!/Usr/bin/env perl के बीच क्या अंतर है?

क्वेंटिन के जवाब स्पष्ट रूप से सही था, और इसलिए मैं इसे स्वीकार कर लिया गया है, लेकिन मुझे लगता है कि क्या मैं वास्तव में मतलब 'था पेशेवरों और # का उपयोग कर के दो तरीकों में से विपक्ष क्या कर रहे हैं! एक स्क्रिप्ट के दुभाषिया के रूप में पर्ल/पायथन/बैश का आह्वान करने के लिए? '

+0

यह सवाल वास्तव में विशिष्ट पटकथा भाषाओं से कोई लेना देना नहीं है, लेकिन मैं इसे पर्ल में चिह्नित क्योंकि उस शीर्षक में इस्तेमाल किया उदाहरण है छोड़ दिया है। – agf

उत्तर

9

एक एक आम जगह पर्ल कि स्थापित किया गया है संदर्भ देता है। दूसरा संदर्भ एक सामान्य स्थान है जिसे env इंस्टॉल किया गया है और यह पूछता है कि डिफ़ॉल्ट perl का पथ क्या है।

3

खुद के निष्पादन को खोजने के लिए env का उपयोग करना, बजाय यह खोजने के लिए एक अतिरिक्त कार्यकारी करता है, लेकिन यह वास्तव में समय के सबसे कोई फर्क नहीं करना चाहिए। यह सुविधाजनक है और मैं अक्सर इसे स्वयं उपयोग करता हूं।

हालांकि, मैं प्रणाली लिपियों में env इस्तेमाल करने वाले लोगों के साथ मुद्दों पड़ा है। On one occasion, एक /usr/local/bin/perl इंस्टॉल करना ताकि मैं इसे अब और अपडेट नहीं कर सका जब तक मैं समस्या का समाधान अपने सिस्टम को तोड़ दिया। On another occasion, /usr/local/bin/python इंस्टॉल करने से मैं जिस आईडी 3 टैगर का उपयोग कर रहा था उसे तोड़ दिया। मुझे लगता है कि यह env के साथ अंतर्निहित समस्या से अधिक पैकेजिंग समस्या है। यदि आप किसी सिस्टम पर कुछ इंस्टॉल कर रहे हैं, तो आप सावधानी से जांच क्यों कर रहे हैं कि इसमें पाइथन का एक संस्करण है जो आपकी सभी निर्भरताओं को पूरा करता है अगर आप केवल एक शेबांग लाइन छोड़ने जा रहे हैं जो हर बार पाइथन के किसी भी पुराने संस्करण के लिए मछलियों को मछलती है यह चलाया जाता है?

कल्पना कीजिए कि आप एक दीप पैकेज/opt/(अर्थात XAMPP) में स्थापित किया है कि यह खुद पर्ल निष्पादन, पुस्तकालयों और pakage प्रबंधक है में शामिल हैं:

+0

मुझे कोई कारण नहीं दिख रहा कि क्यों 'env' को दूसरी प्रक्रिया काटना चाहिए। क्या आपका मतलब "निष्पादन" था, या वैकल्पिक रूप से आप विषय पर विस्तार करना चाहते हैं? –

+0

हां। पोस्ट अपडेट किया गया। धन्यवाद! – oylenshpeegul

1

मैं तुम्हें एक ठोस उदाहरण दे सकते हैं।

आप वास्तव में उस निष्पादन योग्य को चलाने के लिए चाहते हैं ताकि आप अपने पाथ पर्यावरण परिवर्तक (PATH = "/ opt/XAMPP/bin: $ PATH") में LAMP निष्पादन योग्यों के पथ को जोड़ सकें।

अब "#!/Usr/bin/env perl" का उपयोग करने वाली कोई भी स्क्रिप्ट LAMP स्टैक निर्देशिका में perl बाइनरी निष्पादित करेगी। दूसरा पथ आपके सिस्टम में "/ usr/bin/perl" में पूर्व-स्थापित पर्ल बाइनरी निष्पादित करेगा।

यह क्या अपने पर्ल स्क्रिप्ट के लिए बेहतर है तय करने के लिए आप पर निर्भर है।

7

ये अच्छा नियम हैं, अगर आप उन्हें तोड़ने के लिए एक अच्छा कारण है, ऐसा करने के लिए संकोच नहीं करते: जहां संभव heterogenous प्रणालियों के बीच पोर्टेबिलिटी के लिए

उपयोग #!/usr/bin/env perl। लेकिन यह ऐसा करने का एक मूर्ख तरीका है क्योंकि यह धारणा बनाता है कि पथ में पहला पर्ल भी पर्ल है जिसे आप हमेशा चाहते हैं। ऐसा नहीं हो सकता है, और आमतौर पर जब सिस्टम पर कई पर्ल होते हैं तो वे एक निश्चित कारण के लिए होते हैं।

एक बेहतर तरीका एक सीपीएएन-तैयार डिस्ट्रो में स्क्रिप्ट को पैकेज करना है। उन प्रणालियों में distros वितरित करें जहां आप उन्हें स्थापित करना चाहते हैं और उन्हें सामान्य तरीके से (मैन्युअल रूप से या सीपीएएन टूलचेन के साथ) स्थापित करें, पूर्ण पथ से perl या cpan निर्दिष्ट करें। उस प्रक्रिया के दौरान, the shebang line is rewritten पर्ल के सही रास्ते पर।

उदाहरण:

tar -xvf Local-OurCompany-Scripts-1.000.tar.gz 
cd Local-OurCompany-Scripts-1.000 

## automated installation 
/usr/bin/cpan . 
# or perhaps 
/opt/ourcompany/perls/perl-5.14.2/bin/cpan . 

## manual installation 
/usr/bin/perl Makefile.PL ; make ; make install 
# or perhaps 
`which perl5.14.2` Makefile.PL ; make ; make install 
+2

लेकिन आप भूल जाते हैं कि पथ में हेरफेर करना आसानी से किया जाता है - 'एनवी' का उपयोग करके आप विभिन्न कार्यक्रमों (या अलग-अलग कार्यक्रमों के लिए भी अलग-अलग कार्यक्रमों) के लिए अलग-अलग perls का उपयोग कर सकते हैं। एक हार्डकोडेड पर्ल पथ और सीपीएएन की पथ पुनर्लेखन क्षमता का उपयोग करना इस धारणा को बनाता है कि इंस्टॉलेशन करने के लिए उपयोग किया जाने वाला पर्ल वह पर्ल है जिसे आप हमेशा चाहते हैं, जिसे मैं तर्क दूंगा कि 'एनवी' द्वारा की गई एक बड़ी (और बदतर) धारणा है, क्योंकि यह एक सरल "पथ =/पथ/से/अन्य/perl: $ PATH some_perl.pl" के बजाय, इसे ओवरराइड करने के लिए स्रोत को संशोधित करने की आवश्यकता है। –

+0

मैं इस भाग से सहमत हूं: _ "लेकिन यह ऐसा करने का एक बेवकूफ तरीका है क्योंकि यह धारणा बनाता है कि पथ में पहला पर्ल भी पर्ल है जिसे आप हमेशा चाहते हैं।" _ और यह जोड़ देगा कि यह आपकी स्क्रिप्ट मान लेगा पर्ल (और पर्ल-मॉड्यूल) के किसी भी दिए गए उदाहरण के साथ ठीक काम करें। – Gonen

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