यह बेहतर नहीं है जरूरी है।
इसका लाभ #!/usr/bin/env python
यह है कि यह python
उपयोगकर्ता में जो भी निष्पादन योग्य प्रतीत होता है उसका उपयोग करेगा $PATH
।
नुकसान की #!/usr/bin/env python
है कि यह प्रयोग करेंगे जो कुछ भी है python
निष्पादन योग्य उपयोगकर्ता के दशक में पहली बार प्रकट होता $PATH
।
इसका मतलब है कि स्क्रिप्ट अलग तरीके से व्यवहार कर सकती है जो इस बात पर निर्भर करती है कि इसे कौन चलाता है। एक उपयोगकर्ता के लिए, यह /usr/bin/python
ओएस के साथ स्थापित किया गया उपयोग कर सकता है । दूसरे के लिए, यह एक प्रयोगात्मक का उपयोग कर सकता है जो /home/phred/bin/python
सही ढंग से काम नहीं करता है।
और अगर python
केवल में स्थापित किया गया है /usr/local/bin
, यदि कोई उपयोगकर्ता नहीं है /usr/local/bin
में $PATH
भी स्क्रिप्ट चलाने के लिए सक्षम नहीं होगा। (यह शायद आधुनिक प्रणालियों पर बहुत अधिक संभावना नहीं है, लेकिन यह अधिक अस्पष्ट दुभाषिया के लिए आसानी से हो सकता है।)
यह निर्दिष्ट करके कि #!/usr/bin/python
आप किसी विशेष प्रणाली पर स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया का उपयोग करेंगे ।
एक अन्य संभावित समस्या यह है कि यह #!/usr/bin/env
ट्रिक आपको इंट्रप्टर (स्क्रिप्ट के नाम के अलावा, जो अंतर्निहित रूप से पारित हो जाता है) के लिए तर्क पारित करने की अनुमति नहीं देता है । यह आमतौर पर एक मुद्दा नहीं है, लेकिन यह हो सकता है। कई पर्ल स्क्रिप्ट के साथ लिखा गया है #!/usr/bin/perl -w
, लेकिन use warnings;
इन दिनों अनुशंसित प्रतिस्थापन है। Csh लिपियों का उपयोग करना चाहिए #!/bin/csh -f
- लेकिन csh लिपियों की सिफारिश पहले नहीं की जाती है। लेकिन इसके अन्य उदाहरण हो सकते हैं।
मेरे पास एक व्यक्तिगत स्रोत नियंत्रण प्रणाली में कई पर्ल स्क्रिप्ट हैं जिन्हें मैं एक नई प्रणाली पर एक खाता स्थापित करते समय स्थापित करता हूं। मैं एक इंस्टॉलर स्क्रिप्ट का उपयोग करता हूं जो #!
प्रत्येक स्क्रिप्ट की लाइन को संशोधित करता है क्योंकि यह इसे मेरे में स्थापित करता है $HOME/bin
। (मुझे #!/usr/bin/perl
हाल ही में इसके अलावा किसी भी चीज़ का उपयोग नहीं करना पड़ा है ; यह तब तक वापस चला जाता है जब पर्ल अक्सर डिफ़ॉल्ट रूप से स्थापित नहीं होता था।)
एक मामूली बिंदु: #!/usr/bin/env
चाल यकीनन env
कमांड का दुरुपयोग है , जो मूल रूप से इरादा था (जैसा कि नाम से पता चलता है) एक परिवर्तित वातावरण के साथ एक कमांड लागू करने के लिए। इसके अलावा, कुछ पुराने सिस्टम (SunOS 4 सहित, अगर मुझे सही से याद है) में env
कमांड नहीं थी /usr/bin
। न तो इनमें से एक महत्वपूर्ण चिंता का विषय है। env
इस तरह से काम करता है, बहुत सारी स्क्रिप्ट #!/usr/bin/env
चाल का उपयोग करती हैं , और ओएस प्रदाताओं को इसे तोड़ने के लिए कुछ भी करने की संभावना नहीं है। यह एक समस्या हो सकती है यदि आप चाहते हैं कि आपकी स्क्रिप्ट वास्तव में पुरानी प्रणाली पर चले, लेकिन तब आपको इसे फिर से संशोधित करने की आवश्यकता होगी।
एक अन्य संभावित मुद्दा, (टिप्पणी में इसे इंगित करने के लिए सोपालजो डे एरियेरेज़ का धन्यवाद) यह है कि क्रोन नौकरियां एक प्रतिबंधित वातावरण के साथ चलती हैं। विशेष रूप से, $PATH
आमतौर पर ऐसा कुछ होता है /usr/bin:/bin
। इसलिए अगर इंटरप्रेटर वाली निर्देशिका उन निर्देशिकाओं में से एक में नहीं होती है, भले ही वह $PATH
उपयोगकर्ता शेल में आपके डिफ़ॉल्ट में हो, तो यह /usr/bin/env
ट्रिक काम नहीं करने वाली है। आप सटीक पथ निर्दिष्ट कर सकते हैं, या आप $PATH
( man 5 crontab
विवरण के लिए) सेट करने के लिए अपने कॉन्ट्राब में एक रेखा जोड़ सकते हैं ।