Ubuntu में श के लिए बैश का उपयोग कैसे करें


14

मैं एक विशाल कार्यक्रम स्थापित कर रहा हूं, जिसमें एक rpmफ़ाइल के रूप में इसके संसाधन हैं । की लाइन पर अटक गया

#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]

जाहिरा तौर पर, इस वाक्य रचना के साथ Red Hat Linux में shकाम bashकरें, लेकिन यह unexpected operatorउबंटू में त्रुटि देता है ।

मैं स्क्रिप्ट नहीं बदल सकता bashक्योंकि स्क्रिप्ट rpmपैकेज से आती है । मैं rpmपैकेज को निकाल और वापस कर सकता हूं , लेकिन ऐसी कई स्क्रिप्ट्स हो सकती हैं।

क्या शेल डिफॉल्ट को उपचार के #!/bin/shरूप में बदलने के लिए एक तरीका है bashया कुछ और, जो [ऑपरेटर को संभाल सकता है ?


5
केवल एक चीज गलत है ==जो होनी चाहिए =। वह, और वह चर विस्तार दोगुना होना चाहिए।
Kusalananda

4
[एक ऑपरेटर नहीं है, लेकिन एक अंतर्निहित आदेश जिसे कहा जाता है test। अनपेक्षित ऑपरेटर है ==और इसे प्रतिस्थापित किया जाना चाहिए =क्योंकि यह POSIX अनुरूप नहीं है।
विद्वान

दूसरी बात जो गलत है, वह है कि $SCITEGICPERLHOMEउद्धृत किया जाना चाहिए।
l0b0

12
आपको कार्यक्रम के लेखक से शिकायत करनी चाहिए। यदि वे उपयोग करते हैं #!/bin/sh, तो उन्हें यह सुनिश्चित करना चाहिए कि वे केवल POSIX शेल सुविधाओं का उपयोग करें, न कि bashएक्सटेंशन का। यह प्रोग्रामर बहुत मैला है। उसे या तो अपने कोड को ठीक करना चाहिए या उपयोग करना चाहिए #!/bin/bash
बरमार

इसी तरह के अन्य मुद्दों के बारे में सोच रहे लोगों के लिए यहां " बशीज़ " की एक सूची है । यह प्रश्न भी देखें ।
कैप्टन मैन

जवाबों:


21

ऐसे कई कार्यक्रम हैं जो की भाषा को लागू करते हैं /bin/sh। उबंटू पर, /bin/shपानी का छींटा है, जिसे तेजी से डिज़ाइन किया जाता है, थोड़ी मात्रा में मेमोरी का उपयोग करने के लिए, और न्यूनतम अपेक्षित से अधिक समर्थन नहीं करता है /bin/sh। आरएचईएल पर, /bin/shबैश है, जो धीमा है और अधिक मेमोरी का उपयोग करता है लेकिन इसमें अधिक विशेषताएं हैं। इन विशेषताओं में से ==एक [सशर्त सिंटैक्स के लिए ऑपरेटर है । डैश सपोर्ट करता है [, जो एक बेसिक श फीचर है, लेकिन इसमें ==ऑपरेटर नहीं है जो बैश (और ksh और zsh) एक्सटेंशन है।

आप अपने सिस्टम को बैश का उपयोग करने के लिए स्विच कर सकते हैं। उबंटू पर, /bin/shएक प्रतीकात्मक लिंक है dash। आप bashइसके बजाय एक प्रतीकात्मक लिंक बना सकते हैं । डेबियन और उबंटू (और डेरिवेटिव) के वर्तमान संस्करण इसे डैश का इंस्टॉलेशन विकल्प बनाते हैं। इसे बदलने के लिए, भागो

sudo dpkg-reconfigure dash

और जवाब "हाँ" के रूप में पानी का छींटा /bin/shया "नहीं" को दफनाने के लिए स्विच करने के लिए रखें।

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


उन वितरणों के लिए जिनके पास कार्यान्वयन के बीच चयन करने के लिए कोई इंटरफ़ेस नहीं है /bin/sh, यहाँ कैसे bash पर स्विच किया जाए।

sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh

एक टर्मिनल खुला रखें और जांचें कि आप shउसके बाद भी कुछ स्क्रिप्ट चला सकते हैं । यदि आप इस कमांड को गड़बड़ करते हैं, तो यह आपके सिस्टम को अनुपयोगी बना देगा। (वैसे, कारण मैं कई आदेशों से ऊपर के बजाय सीधा दिखने का इस्तेमाल किया sudo ln -sf bash /bin/shहै कि ln -sfपरमाणु नहीं है। वैसे संभावना नहीं मामले आपके कंप्यूटर इस आपरेशन के दौरान दुर्घटनाग्रस्त हो गया है, तो आप बचाव मीडिया से बूट करने के लिए आवश्यकता होगी यह बहाल करने के लिए। इसके विपरीत, mvपरमाणु है।)

के रूप में पानी का छींटा बहाल करने के लिए /bin/sh:

sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh

ध्यान दें कि यदि /bin/bashआपके वितरण में sh डिफ़ॉल्ट रूप से है, तो डैश पर स्विच करने से स्क्रिप्ट विफल हो सकती है, क्योंकि डैश में डैश की तुलना में कई अधिक विशेषताएं हैं। बैश स्क्रिप्ट के साथ शुरू होना चाहिए #!/bin/bash, और स्क्रिप्ट के साथ शुरू होने के #!/bin/shलिए बैश-विशिष्ट सुविधाओं का उपयोग नहीं करना चाहिए, लेकिन बश के साथ जहाज का वितरण स्क्रिप्ट /bin/shमें बैश-विशिष्ट सुविधाओं का उपयोग कर सकता #!/bin/shहै जो उस वितरण के लिए विशिष्ट हैं (यह तब तक ठीक है जब तक कि कोई उम्मीद नहीं है कि उपयोगकर्ता के रूप में पानी का छींटा करने के लिए स्विच कर सकते हैं /bin/shऔर कोई उम्मीद नहीं है कि ये स्क्रिप्ट दूसरे वितरण पर काम करते हैं)।


मेरी इतनी विनम्र राय में, अगर कुछ स्क्रिप्ट /bin/shबैश होने पर विफल हो जाती है, तो यह सिस्टम में एक बग (स्क्रिप्ट के साथ पैकेज), या बैश के sh-मोड में है। जैसे स्टीफन कहते हैं, सिस्टम स्पष्ट रूप /bin/shसे बैश, के माध्यम से वापस स्थापित करने की अनुमति देता है dpkg-reconfigure। यह इस मामले पर उबंटू विकी में एक संभावना के रूप में भी वर्णित है: wiki.ubuntu.com/DashAsBinSh
ilkkachu

5
@ilkachach हाँ, अगर कोई स्क्रिप्ट /bin/shबैश होती है, तो यह एक बग है। हालाँकि, बग होते हैं। यदि आप सक्षम नहीं हैं, तो मैं डिफ़ॉल्ट रूप से चिपके रहने की सलाह देता हूं और ऐसे बग का निदान करने के लिए तैयार हूं क्योंकि अन्य लोगों ने आपके लिए इसका परीक्षण किया है। मैंने /bin/shडेबियन पर आधिकारिक रूप से समर्थित होने से पहले डैश का उपयोग किया था, लेकिन यह एक जोखिम था जिसे मैंने लिया, यह जानते हुए कि अगर कुछ हुआ तो मैं सामना कर पाऊंगा।
गिल्स एसओ- बुराई को रोकना '

ध्यान दें कि मैन्युअल रूप से ओवरराइड किए गए सिम्लिंक को फिर से अपडेट किया जाएगा जो भी debconfअगली बार dashअपडेट किया जाए; माना जाता है कि यह अक्सर (यदि किसी दिए गए रिलीज में, तो) डिबियन स्थिर चल रही प्रणालियों के लिए अक्सर नहीं होगा।
स्टीफन किट

36

स्विच shकरने के लिए bash( dashडिफ़ॉल्ट के बजाय ), पुन: कॉन्फ़िगर करें dash(हाँ, यह कुछ हद तक सहज है):

sudo dpkg-reconfigure dash

यह पूछेगा कि क्या आप dashडिफ़ॉल्ट सिस्टम शेल बनना चाहते हैं ; उत्तर "नहीं" ( Tabतब Enter) और bashइसके बजाय डिफ़ॉल्ट हो जाएगा ( यानी /bin/sh इंगित करेगा /bin/bash)।


1
आपका समाधान वास्तव में सबसे उचित है, लेकिन मैंने इस मुद्दे को स्पष्ट करने वाले विस्तृत विवरण के कारण एक और उत्तर स्वीकार किया। किसी भी असुविधा के लिए खेद है।
Googlebot

@Googlebot को माफी माँगने की कोई आवश्यकता नहीं है, स्वीकृत उत्तर का चयनकर्ता का विशेषाधिकार है। और मुझे इसमें से एक गोल्ड बैज मिला ;-)।
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.