मैं देखा है कि वहाँ एक पर्ल कार्यक्रम को क्रियान्वित करने के दो तरीके हैं कि:"perl test.pl" और "./test.pl" के बीच क्या अंतर है?
perl test.pl
और
./test.pl
इन दोनों के बीच सटीक अंतर क्या है और जो एक recommendable है?
मैं देखा है कि वहाँ एक पर्ल कार्यक्रम को क्रियान्वित करने के दो तरीके हैं कि:"perl test.pl" और "./test.pl" के बीच क्या अंतर है?
perl test.pl
और
./test.pl
इन दोनों के बीच सटीक अंतर क्या है और जो एक recommendable है?
पहले मामले में आप perl
दुभाषिया शुरू कर रहे हैं और इसे अपनी फ़ाइल का उपयोग करने और इसे चलाने के लिए कह रहे हैं।
दूसरे मामले में आप अपनी फ़ाइल को निष्पादित करने के लिए अपने खोल पूछ रहे हैं। इसकी आवश्यकता है कि फ़ाइल
#!/<path to perl>/perl
और फ़ाइल के निष्पादन बिट सेट के साथ शुरू होता है।
उपयोग करने का सबसे अच्छा तरीका वह है जो आपके उपयोगकेस को सर्वोत्तम बनाता है।
पहला perl
का उपयोग कर प्रोग्राम को निष्पादित करता है जो आपके $PATH
में पहले पाया जाता है। प्रोग्राम में जो भी shebang लाइन है, उसका दूसरा उपयोग करता है।
पहले एक हमेशा perl
कोड के रूप में स्क्रिप्ट चलेंगे।
दूसरा यह केवल तभी करेगा जब पर्ल को उस-बैंग में निर्दिष्ट किया गया हो। अन्यथा यह इसे शैल कोड के रूप में चलाएगा या जो कुछ भी निर्दिष्ट है वह बैंग में है (अगर कोई भी बैंग नहीं है तो यह वर्तमान शेल कोड के रूप में चलाएगा)।
पहला वाला भी noexec
माउंट विकल्प सक्षम किया जाएगा।
दूसरा उस मामले में असफल हो जाएगा।
निष्पादित बिट के साथ एक ही सामान। पहला 0 काम करेगा यदि +x
सेट नहीं है, दूसरा असफल हो जाएगा।
क्या आप निश्चित रूप से गायब हैं शेबैंग सिस्टम शेल के विपरीत "वर्तमान खोल" कोड है? ऐसा लगता है कि यह पूर्व है लेकिन मुझे अनिश्चित है – DVK
मैं कुछ अन्य उत्तरों के बारे में बताऊंगा। एक पर्ल भाषा अनुवादक शायद, है, और पहले पैरामीटर के रूप में यह करने के लिए मूल्य "test.pl" पास -
पहला मामला कार्यक्रम "पर्ल" कहा जाता चलेंगे। कृपया ध्यान दें है और क्या "test.pl" है कि यह 3 में से एक काम करेंगे, क्या "पर्ल" के आधार पर:
"पर्ल" अपने $PATH
या एक खोल में एक निष्पादन योग्य के रूप में मौजूद नहीं है उपनाम (which perl
चलाकर जांचें), आपका खोल गैर-मौजूदा निष्पादन योग्य खोजने का प्रयास करेगा, और perl: Command not found
त्रुटि के साथ विफल हो जाएगा।
यदि "perl" आपके पथ (या एक खोल उपनाम) में निष्पादन योग्य है जो वास्तव में एक पर्ल दुभाषिया प्रोग्राम नहीं है, जो इसके बजाय निष्पादित हो जाएगा। उदाहरण के रूप में csh में इस प्रयास करें:
alias perl echo
which perl # Will print "perl: aliased to echo"
perl test.pl # Will print "test.pl". NOT what you intended!
unalias perl
यह आपका "पर्ल" उर्फ निष्पादित करेंगे और बस शब्द "परीक्षण गूंज।पीएल "
यदि" पार्ल "आपके पथ में एक निष्पादन योग्य है जो वास्तविक पर्ल दुभाषिया है, तो यह पहले पैरामीटर के रूप में" test.pl "को पास करेगा। उस स्थिति में, पर्ल दुभाषिया इस पैरामीटर का इलाज करेगा (क्योंकि यह निष्पादित करने के लिए पर्ल कोड वाली फ़ाइल के नाम के रूप में शुरू नहीं होता है और फ़ाइल को पढ़ने की कोशिश करता है, इसे पर्ल कोड के रूप में संकलित करें और इसे निष्पादित करें।
ध्यान दें कि, कार्यक्रम के बाद से रन किया जा रहा है वास्तव में "पर्ल" और "test.pl" है सिर्फ एक पाठ फ़ाइल में पढ़ा जा रहा है, "test.pl" "अमल" यूनिक्स फ़ाइल अनुमति की आवश्यकता नहीं है।
दूसरा मामला, खोल आपके वर्तमान निर्देशिका में "test.pl" नामक फ़ाइल ढूंढने का प्रयास करेगा, और - यदि यह मौजूद है और निष्पादन योग्य है - इसे प्रोग्राम के रूप में निष्पादित करने का प्रयास करें।
फ़ाइल मौजूद नहीं है या यदि उस पर अमल बिट सेट नहीं है, खोल त्रुटि "नहीं मिला आदेश" के साथ असफल हो जायेगी।
यदि फ़ाइल निष्पादित बिट सेट है, तो खोलें (या वास्तव में यूनिक्स कर्नेल में लोडर को संसाधित करें) इसे निष्पादित करने का प्रयास करेगा। जिन नियमों से यूनिक्स किसी निष्पादन योग्य फ़ाइल को निष्पादित करता है, वह फ़ाइल के पहले 2 बाइट, उर्फ "जादू संख्या" द्वारा शासित होता है।
जादू संख्याओं के काम के बारे में बहुत अच्छी गहन कवरेज के लिए, SO पर प्रश्न "How does the #! work?
" देखें।
एक विशेष मामले में जहां "जादू संख्या" "#!" है (उर्फ "शेबांग"), लोडर फ़ाइल की पहली पंक्ति पढ़ेगा, और उस निष्पादन योग्य फ़ाइल के बजाए चलाने के लिए कमांड के रूप में उस पंक्ति की सामग्री (पहले 2 बाइट्स) को संसाधित करेगा; और निष्पादन योग्य फ़ाइल के पथ को शेबांग लाइन से पढ़ने वाले कमांड के लिए एक और पैरामीटर के रूप में संलग्न करें। उदाहरण के रूप में:
अगर "test.pl" #!/bin/sh -x
की पहली पंक्ति के साथ एक पाठ फ़ाइल है, कर्नेल /bin/sh -x ./test.pl
निष्पादित करेंगे।
अगर "test.pl" #!/usr/bin/perl
की पहली पंक्ति के साथ एक पाठ फ़ाइल है, कर्नेल /usr/bin/perl ./test.pl
निष्पादित करेंगे।
अगर "test.pl" #!perl
की पहली पंक्ति के साथ एक पाठ फ़ाइल है, कर्नेल perl ./test.pl
निष्पादित करेंगे।
यदि "test.pl" my $var = 1;
की पहली पंक्ति के साथ एक टेक्स्ट फ़ाइल है (या किसी अन्य पहले 2 बाइट्स को यह नहीं पता कि इसके साथ क्या करना है), तो यह या तो त्रुटि होगी या (कम से कम RedHat पर लिनक्स) दिखाएगा कि #!/bin/sh
शेबैंग एक अंतर्निहित था और फ़ाइल को बोर्न शेल स्क्रिप्ट के रूप में निष्पादित करने का प्रयास करें। कौन सा कोर्स के असफल हो जायेगी, क्योंकि यह पर्ल कोड था, नहीं खोल स्क्रिप्ट
पर्ल परीक्षण।pl
./test.pl
perl test.pl $ पाथ की जांच नहीं करेगा। – DVK
यू फ़ाइल के लिए निष्पादन योग्य अनुमति सेट है, तो आप फ़ाइल ./ द्वारा वरना चला सकते हैं पर्ल filename.pl
तक सही उपयोग करते हुए बिट सेट, आप अनुमतियाँ मतलब निष्पादित, चलते हैं? –
@rad हां, इसे 'chmod' कमांड के साथ सेट करने के रूप में। – HonkyTonk
ठीक है, धन्यवाद! –