यह बेहतर नहीं है जरूरी है।
इसका लाभ #!/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विवरण के लिए) सेट करने के लिए अपने कॉन्ट्राब में एक रेखा जोड़ सकते हैं ।