शेबंग में किस प्रकार का मार्ग अधिक बेहतर है?


20

स्क्रिप्ट में, पहली पंक्ति को दुभाषिया के लिए पथ निर्दिष्ट करना चाहिए।
लेकिन अलग-अलग सर्वरों पर लिनक्स, यूनिक्स या बीएसडी यह पथ भिन्न हो सकता है।

अधिक बेहतर क्या है?

#!/usr/bin/env bash 

या

#!/bin/bash 

जवाबों:


22

यदि आप किसी दिए गए दुभाषिया के सिस्टम-स्थापित संस्करण का उपयोग करना चाहते हैं जो एक मानक स्थान पर स्थापित है, तो सीधे पथ का उपयोग करें। यदि आप दुभाषिया के किसी भी संस्करण का उपयोग करना चाहते हैं, तो उपयोगकर्ता में पहले प्रकट होता है $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 / env माणिक [/ code] से शुरू करना है। कुछ लोगों ने कहा कि इससे रूबी दुभाषिया को कमांड-लाइन तर्कों की आपूर्ति करना मुश्किल हो जाता है, जैसे '-w', जो पर्ल के लिए भी एक समस्या होगी।
bgvaughan

पर्ल के लिए @bgugughan, यह आजकल के बजाय स्क्रिप्ट के शरीर में #!/usr/bin/perlउपयोग करने के लिए पारंपरिक है । लेकिन शेबांग पर होना है। use strict; use warnings;#!/usr/bin/perl -w-T
कीथ थॉम्पसन

तो क्यों हम # का उपयोग नहीं करते हैं?
व्हायरिडेधातनामेकोमफ्रॉम

@wheredidthatnamecomefrom: क्योंकि वह काम नहीं करता है। #!लाइन का उपचार उपयोग नहीं करता है $PATH। आपको दुभाषिया का मार्ग निर्दिष्ट करना होगा। (मुझे बस एहसास हुआ कि, कम से कम मेरे सिस्टम पर, यह एक सापेक्ष पथ हो सकता है, लेकिन यह शायद ही कभी उपयोगी है।)
कीथ थॉम्पसन

6

सबसे अच्छा अभ्यास यह है:

#!/usr/bin/env bash 
#!/usr/bin/env sh
#!/usr/bin/env python

और इसी तरह...

जब उबंटू ने पहली बार पानी का छींटा इस्तेमाल करना शुरू किया, तो कुछ स्क्रिप्ट टूट गईं। इसे लेकर चर्चा हुई। अधिकांश लिपियाँ लिखी गई थीं #!/bin/shजो / बिन / बैश की एक कड़ी थी। आम सहमति यह है: स्क्रिप्ट लेखक दुभाषिया को निर्दिष्ट करने के लिए जिम्मेदार है। इसलिए, यदि आपकी स्क्रिप्ट को हमेशा BASH के साथ लागू किया जाना चाहिए, तो इसे पर्यावरण से निर्दिष्ट करें। यह आपको पथ का अनुमान लगाने से बचाता है, जो विभिन्न यूनिक्स / लिनक्स सिस्टम पर अलग है। इसके अलावा, यह काम करेगा यदि कल / बिन / श किसी अन्य शेल जैसे / बिन / wthsh या कुछ अन्य बकवास के लिए एक कड़ी बन जाता है।


डैश समस्या के लिए स्पष्ट वैकल्पिक समाधान लिखना था #!/bin/bash। मैं सहमत हूं कि स्क्रिप्ट लेखक दुभाषिया को निर्दिष्ट करने के लिए ज़िम्मेदार है, लेकिन इसका मतलब है कि यदि आपको बैश की आवश्यकता है, तो बैश न करें
मार्टिन बोनर

1

FYI करें यह एक shee-बैंग है #!, आप की जरूरत #। स्क्रिप्ट को चलाने के लिए कौन से दुभाषिया की पहचान करने के लिए आप इस लाइन का उपयोग करते हैं।

डिफ़ॉल्ट रूप से, Ubuntu /bin/shडैश से लिंक करता है

निर्भर करता है कि आप डैश के बारे में कितना जानना चाहते हैं और क्यों डैश का उपयोग सिस्टम या डेमॉन शेल के लिए किया जाता है:

cyberciti.biz डैश

उबंटू डैश मैन पेज

बैश अधिकांश लिनक्स उपयोगकर्ताओं द्वारा उपयोग किया जाने वाला डिफ़ॉल्ट शेल है, और अलग-अलग विशेषताएं हैं फिर डैश। डैश के लिए लिखी गई स्क्रिप्ट ठीक से नहीं चल सकती है या यदि डैश के साथ चलती है, तो स्क्रिप्ट जितनी अधिक जटिल होगी, उतनी ही कम चलेगी।

पर्ल, पाइथन आदि के लिए लिखी गई स्क्रिप्ट बिल्कुल भी /bin/shया उसके साथ नहीं चलेगी /bin/bash

इसलिए जब आप एक स्क्रिप्ट लिखते हैं, तो आप पहचानते हैं कि शीन-बैंग के साथ किस दुभाषिया का उपयोग किया जाना चाहिए

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


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