पसंदीदा बैश शेबंग क्या है?


1127

क्या कोई भी Bashशेबंग अधिकांश उपयोगों के लिए दूसरों की तुलना में बेहतर है?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • आदि

मैं बहुत समय पहले याद करते हुए सुनता हूं कि अंत में एक डैश जोड़ने से कोई व्यक्ति आपकी स्क्रिप्ट को कमांड पास करने से रोकता है, लेकिन उसके बारे में कोई विवरण नहीं मिल सकता है।


4
और /usr/local/bin/bashOpenBSD पर इसका ।
jww

जवाबों:


1531

आप का उपयोग करना चाहिए #!/usr/bin/env bashके लिए पोर्टेबिलिटी : विभिन्न * nixes डाल bashविभिन्न स्थानों में, और का उपयोग कर /usr/bin/envपहली चलाने के लिए एक समाधान नहीं है bashपर पाया PATH। और shनहीं हैbash


9
धन्यवाद। यह भी जोड़कर देखता है - $ के अंत तक! / Usr / bin / env bash - कुछ भी नहीं करेगा क्योंकि केवल एक तर्क को शेबंग में * nix द्वारा अनुमति नहीं है, और इसका उपयोग 'bash' द्वारा किया जाता है। यह जाहिरा तौर पर केवल कमांडलाइन पर स्क्रिप्ट में पास किए जा रहे दुर्भावनापूर्ण तर्कों को रोकने के लिए उपयोगी है यदि स्क्रिप्ट का शेबंग अन्य लोगों में से कोई तर्क ( /bin/sh, आदि) है।
कर्टोसिस

13
@ सभी प्रणालियों पर bashनहीं रहते /binहैं।
ptierno

12
मेरे लिए भी, मैंने इसे केवल एक उपनाम में जोड़ा है: alias shebang='echo "#!/usr/bin/env bash"'अब मुझे बस टर्मिनल खोलना है और यहाँ जाने के बजाय शेबंग टाइप करना है।
ओएलेक्स

19
यह उत्तर भ्रामक है। POSIX यह नहीं कहता कि envऐसा है /usr/bin/env। यह /bin/envवास्तव में या कहीं भी हो सकता है, जब तक यह मार्ग में है। /dummy/envअगर ऐसा हो सकता /dummyहै PATH। POSIX के तहत शेबंग खुद अपरिभाषित है, इसलिए मैं #!stop toasterUSB कॉफी मशीन शुरू कर सकता हूं और POSIX अनुरूप हो सकता हूं । तो #!/usr/bin/env bashविशेष रूप से बेहतर नहीं है #!/bin/bash, यह कम पोर्टेबल हो सकता है निर्भर करता है।
डार्कफलाइन

19
@darkfeline पोर्टेबिलिटी निरपेक्ष नहीं है - किसी भी स्क्रिप्ट को बनाने के लिए गणितीय रूप से असंभव है जो हर प्लेटफॉर्म पर एक ही काम करेगा। 2012 के माध्यम से 2018 के माध्यम /usr/bin/envसे या तो /bin/bashएक्सोर की तुलना में अधिक मशीनों पर मौजूद है /usr/bin/bash, इसलिए इस लाइन के साथ शुरू होने वाली स्क्रिप्ट यथासंभव कई मशीनों पर अपेक्षित काम
l0b0

80

/bin/shआमतौर पर सिस्टम के डिफॉल्ट शेल का लिंक होता है, जो कि अक्सर होता है bash, जैसे, डेबियन सिस्टम हल्का वजन dash। किसी भी तरह से, मूल बॉर्न शेल है sh, इसलिए यदि आपकी स्क्रिप्ट कुछ bash(2 वीं पीढ़ी, "बॉर्न अगेन श") विशिष्ट विशेषताओं ( [[ ]]परीक्षण, सरणियां, विभिन्न शर्करा वाली चीजें, आदि) का उपयोग करती है, तो आपको अधिक विशिष्ट होना चाहिए और बाद में उपयोग करना चाहिए। । इस तरह, सिस्टम पर जहां बैश स्थापित नहीं है, आपकी स्क्रिप्ट नहीं चलेगी। मैं समझता हूं कि इस विकास के बारे में फिल्मों की एक रोमांचक त्रयी हो सकती है ... लेकिन यह दिलकश हो सकती है।

यह भी ध्यान दें कि जब कुछ के रूप में विकसित किया जाता है sh, bashतो कुछ हद तक POSIX मानक के रूप में व्यवहार करता है sh (इसके बारे में GNU डॉक्स भी देखें )।


2
पब्लिक डोमेन कोर्न शेल (pdksh) OpenBSD पर डिफ़ॉल्ट है।
jww

अधिकांश प्रणालियां कहीं से भी लिंक नहीं करेंगी क्योंकि यह इनिट स्क्रिप्ट के लिए कठिन है जिससे पहले इसे चलाया जा सके। /bin/sh/usr/usr
ऐज

@aij मैं नहीं जानता कि मैं क्यों डाल "कई या सबसे" वहाँ - मैं एक फेडोरा उपयोगकर्ता है, जहां कर रहा हूँ /binऔर /sbinसाल के लिए सिर्फ डिफ़ॉल्ट रूप से सिमलिंक किया गया है, के लिए /usr/binऔर /usr/sbin, इसलिए उस संदर्भ में /bin/shकरने के लिए एक कड़ी है bashऔर वास्तविक निर्देशिका है /usr/bin। लेकिन मैं ऊपर सही करूंगा।
delicateLatticeworkFever

43

मैं उपयोग करने की सलाह देता हूं:

#!/bin/bash

यह 100% पोर्टेबल नहीं है (कुछ सिस्टम bashएक स्थान के अलावा किसी अन्य स्थान पर हैं /bin), लेकिन यह तथ्य कि बहुत सी मौजूदा स्क्रिप्ट्स #!/bin/bashविभिन्न ऑपरेटिंग सिस्टमों का उपयोग करती हैं /bin/bash, कम से कम मुख्य स्थान के लिए सिमलिंक बनाने के लिए।

का विकल्प:

#!/usr/bin/env bash

सुझाव दिया गया है - लेकिन इस बात की कोई गारंटी नहीं है कि envकमांड में है /usr/bin(और मैंने सिस्टम का उपयोग किया है जहां यह नहीं है)। इसके अलावा, यह फ़ॉर्म bashवर्तमान उपयोगकर्ताओं में पहले उदाहरण का उपयोग करेगा $PATH, जो बैश शेल का उपयुक्त संस्करण नहीं हो सकता है।

(लेकिन /usr/bin/envकिसी भी कारण envसे आधुनिक प्रणाली पर काम करना चाहिए, क्योंकि या तो है /usr/binया क्योंकि सिस्टम इसे काम करने के लिए कुछ करता है। जिस सिस्टम को मैंने ऊपर उल्लेखित किया था वह सनोस 4 था, जिसे मैंने लगभग 25 वर्षों में उपयोग नहीं किया है।)

यदि आपको ऐसी प्रणाली पर चलने के लिए स्क्रिप्ट की आवश्यकता है जो आपके पास नहीं है /bin/bash, तो आप स्क्रिप्ट को सही स्थान पर इंगित करने के लिए संशोधित कर सकते हैं (जो कि अनिवार्य रूप से असुविधाजनक है)।

मैं में अधिक से अधिक गहराई में समझौतों से चर्चा की है मेरा उत्तर करने के लिए इस सवाल का

एक हद तक अस्पष्ट अद्यतन: एक प्रणाली मैं उपयोग करते हैं, Termux , एक डेस्कटॉप-लिनक्स-जैसा परत एंड्रॉयड के तहत रन भी नहीं है कि /bin/bash( bashहै /data/data/com.termux/files/usr/bin/bash) - लेकिन यह समर्थन करने के लिए विशेष हैंडलिंग है #!/bin/bash


3
2-साल बाद और यह अभी भी यहाँ सबसे अच्छी सलाह है। यदि सरल समाधान काम नहीं करता है तो आपको अपने पहले के फैसलों पर सवाल उठाने होंगे। स्वीकृत और सबसे उत्क्रमित उत्तर गलत नहीं है, यह सिर्फ सही नहीं है :)
सॉफ्टवेयर इंजीनियर

26

उचित दुभाषिया लगाने के लिए एक शेबबैंग लाइन का उपयोग करना केवल BASH के लिए नहीं है। आप अपने सिस्टम पर किसी भी व्याख्या की गई भाषा जैसे कि पर्ल, पायथन, पीएचपी (सीएलआई) और कई अन्य लोगों के लिए शेबंग का उपयोग कर सकते हैं। वैसे, शेबंग

#!/bin/sh -

(यह भी दो डैश हो सकता है, यानी --) फ़ाइल नाम और तर्क के रूप में माने जाने के बाद सब कुछ खत्म हो जाएगा।

envकमांड का उपयोग आपकी स्क्रिप्ट को पोर्टेबल बनाता है और आपको अपनी स्क्रिप्ट के लिए कस्टम वातावरण सेटअप करने की अनुमति देता है इसलिए पोर्टेबल स्क्रिप्ट का उपयोग करना चाहिए

#!/usr/bin/env bash

या जो भी भाषा जैसे पर्ल के लिए है

#!/usr/bin/env perl

इसके लिए manपृष्ठों को देखना सुनिश्चित करें bash:

man bash

और env:

man env

नोट: पर डेबियन और डेबियन-आधारित सिस्टम, Ubuntu की तरह, shसे जुड़ा हुआ है dashनहीं bash। जैसा कि सभी सिस्टम स्क्रिप्ट का उपयोग करते हैं sh। यह डेबियन के अनुसार बैश को बढ़ने और प्रणाली को स्थिर रहने की अनुमति देता है।

इसके अलावा, आह्वान * निक्स को बनाए रखने के लिए जैसे मैं कभी भी शेलंग इनवॉइस स्क्रिप्ट पर फ़ाइल एक्सटेंशन का उपयोग नहीं करता, जैसा कि आप निष्पादक पर दिए गए आह्वान पर विस्तार को छोड़ नहीं सकते हैं जैसा कि आप विंडोज पर कर सकते हैं। फाइल कमांड इसे एक स्क्रिप्ट के रूप में पहचान सकता है।


4

यह वास्तव में इस बात पर निर्भर करता है कि आप अपनी बैश स्क्रिप्ट कैसे लिखते हैं। यदि आपकी /bin/shबैश के लिए सहानुभूति है, जब बैश के रूप में लागू किया जाता है sh, तो कुछ विशेषताएं अनुपलब्ध हैं

यदि आप bash-specific, non-POSIX सुविधाएँ चाहते हैं, तो उपयोग करें #!/bin/bash


3
ओपनबीएसडी पर बैश स्थापित नहीं है। यदि आप इसे स्थापित करते हैं pkg_add, तो इसके अंदर स्थित है /usr/local/bin, जो ऑन-पाथ नहीं हो सकता है।
jww

एक POSIXसुविधा के बारे में कैसे ?
निकोलन असद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.