स्क्रिप्ट में, पहली पंक्ति को दुभाषिया के लिए पथ निर्दिष्ट करना चाहिए।
लेकिन अलग-अलग सर्वरों पर लिनक्स, यूनिक्स या बीएसडी यह पथ भिन्न हो सकता है।
अधिक बेहतर क्या है?
#!/usr/bin/env bash
या
#!/bin/bash
स्क्रिप्ट में, पहली पंक्ति को दुभाषिया के लिए पथ निर्दिष्ट करना चाहिए।
लेकिन अलग-अलग सर्वरों पर लिनक्स, यूनिक्स या बीएसडी यह पथ भिन्न हो सकता है।
अधिक बेहतर क्या है?
#!/usr/bin/env bash
या
#!/bin/bash
जवाबों:
यदि आप किसी दिए गए दुभाषिया के सिस्टम-स्थापित संस्करण का उपयोग करना चाहते हैं जो एक मानक स्थान पर स्थापित है, तो सीधे पथ का उपयोग करें। यदि आप दुभाषिया के किसी भी संस्करण का उपयोग करना चाहते हैं, तो उपयोगकर्ता में पहले प्रकट होता है $PATH
, उपयोग करें #!/usr/bin/env ...
।
env
आदेश एक निर्दिष्ट कमांड का आह्वान है, जिससे आप सेट है या सेट वातावरण चर:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
यदि आप किसी भी पर्यावरण चर या अन्य विकल्पों को निर्दिष्ट नहीं करते हैं, तो यह नामांकित कमांड को लागू करेगा। (इस तरह से इसका उपयोग यकीनन थोड़ा हैक है।)
शेबंग के रूप में लिखने का उद्देश्य
#!/usr/bin/env interp
जो कुछ भी interp
पहले दिखाई देता है उसे लागू करना है $PATH
।
इसका मतलब है आप को पता है, जब स्क्रिप्ट लिखने की जरूरत नहीं है, वास्तव में कहां interp
है (जैसे कि, अगर यह या तो में हो सकता है /bin
, /usr/bin
या /usr/local/bin
)। बेशक आप को पता है कि env
है /usr/bin/env
, लेकिन यह काफी सार्वभौमिक लगता है।
लाभ यह है कि यह उपयोगकर्ता में सबसे पहले दिखाई देने वाले दुभाषिया के संस्करण को आमंत्रित करता है $PATH
। नुकसान यह आह्वान जो भी दुभाषिये की संस्करण उपयोगकर्ता के में पहली प्रकट होता है $PATH
।
उदाहरण के लिए, मान लीजिए कि मैंने perl
अपने होम डायरेक्टरी के तहत एक व्यक्तिगत बिल्ड स्थापित किया है , जैसा कि $HOME/bin/perl
, और मेरे $HOME/bin
सामने है $PATH
। अगर मैं एक स्क्रिप्ट चलाता हूं, जिसका शेबंग है
#!/usr/bin/env perl
तो यह मेरे अपने स्थापित perl
निष्पादन योग्य के साथ चलाया जाएगा - जो एक अच्छी बात नहीं हो सकती है। स्क्रिप्ट के लेखक ने शायद ब्लीडिंग-एज पर्ल के साथ इसका परीक्षण नहीं किया है जो मैंने एक महीने पहले स्रोत से बनाया था।
पर्ल या बैश जैसी किसी चीज़ के लिए, जो कि अधिकांश सिस्टम ( /usr/bin/perl
और /bin/bash
क्रमशः) पर एक सुसंगत स्थान पर स्थापित होने की संभावना है , मैं कमांड के लिए सीधे पथ का उपयोग करूँगा। कुछ और अस्पष्ट के लिए जो अलग-अलग प्रणालियों पर अलग-अलग तरीके से स्थापित किए जा सकते हैं, मैं या तो /usr/bin/env
ट्रिक का उपयोग करूंगा, या मैं एक इंस्टॉलर लिखूंगा जो स्क्रिप्ट स्थापित होने के साथ ही शेल्बर लाइन को समायोजित करता है। (मुझे अपनी पर्ल स्क्रिप्ट के लिए ऐसा करना पड़ता था।)
अद्यतन: मैं में थोड़ा अधिक विस्तार में चले गए हैं इस उत्तर के लिए इस सवाल का पर यूनिक्स और लिनक्स साइट ।
#!/usr/bin/perl
उपयोग करने के लिए पारंपरिक है । लेकिन शेबांग पर होना है। use strict; use warnings;
#!/usr/bin/perl -w
-T
#!
लाइन का उपचार उपयोग नहीं करता है $PATH
। आपको दुभाषिया का मार्ग निर्दिष्ट करना होगा। (मुझे बस एहसास हुआ कि, कम से कम मेरे सिस्टम पर, यह एक सापेक्ष पथ हो सकता है, लेकिन यह शायद ही कभी उपयोगी है।)
सबसे अच्छा अभ्यास यह है:
#!/usr/bin/env bash
#!/usr/bin/env sh
#!/usr/bin/env python
और इसी तरह...
जब उबंटू ने पहली बार पानी का छींटा इस्तेमाल करना शुरू किया, तो कुछ स्क्रिप्ट टूट गईं। इसे लेकर चर्चा हुई। अधिकांश लिपियाँ लिखी गई थीं #!/bin/sh
जो / बिन / बैश की एक कड़ी थी। आम सहमति यह है: स्क्रिप्ट लेखक दुभाषिया को निर्दिष्ट करने के लिए जिम्मेदार है। इसलिए, यदि आपकी स्क्रिप्ट को हमेशा BASH के साथ लागू किया जाना चाहिए, तो इसे पर्यावरण से निर्दिष्ट करें। यह आपको पथ का अनुमान लगाने से बचाता है, जो विभिन्न यूनिक्स / लिनक्स सिस्टम पर अलग है। इसके अलावा, यह काम करेगा यदि कल / बिन / श किसी अन्य शेल जैसे / बिन / wthsh या कुछ अन्य बकवास के लिए एक कड़ी बन जाता है।
#!/bin/bash
। मैं सहमत हूं कि स्क्रिप्ट लेखक दुभाषिया को निर्दिष्ट करने के लिए ज़िम्मेदार है, लेकिन इसका मतलब है कि यदि आपको बैश की आवश्यकता है, तो बैश न करें
FYI करें यह एक shee-बैंग है #!
, आप की जरूरत #
। स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया की पहचान करने के लिए आप इस लाइन का उपयोग करते हैं।
डिफ़ॉल्ट रूप से, Ubuntu /bin/sh
डैश से लिंक करता है
निर्भर करता है कि आप डैश के बारे में कितना जानना चाहते हैं और क्यों डैश का उपयोग सिस्टम या डेमॉन शेल के लिए किया जाता है:
बैश अधिकांश लिनक्स उपयोगकर्ताओं द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट शेल है, और अलग-अलग विशेषताएं हैं फिर डैश। डैश के लिए लिखी गई स्क्रिप्ट ठीक से नहीं चल सकती है या यदि डैश के साथ चलती है, तो स्क्रिप्ट जितनी अधिक जटिल होगी, उतनी ही कम चलेगी।
पर्ल, पाइथन आदि के लिए लिखी गई स्क्रिप्ट बिल्कुल भी /bin/sh
या उसके साथ नहीं चलेगी /bin/bash
।
इसलिए जब आप एक स्क्रिप्ट लिखते हैं, तो आप पहचानते हैं कि शीन-बैंग के साथ किस दुभाषिया का उपयोग किया जाना चाहिए
क्या उपयोग करना है इसका चयन स्क्रिप्ट के लेखक द्वारा किया जाता है, और एक बेहतर नहीं है तो दूसरा, उन सभी में विभिन्न विशेषताएं, फायदे और नुकसान हैं।