यही सवाल किसी भी प्रकार की स्क्रिप्ट का उपयोग करते समय उठ सकता है, न कि केवल बैश वाले। क्या दुभाषिया के माध्यम से एक स्क्रिप्ट चलाने और इसे सीधे चलाने के बीच एक बड़ा अंतर है?
एक और रहस्य जिसे हम इस दिलचस्प पोस्ट में लेट्स यूज़ लिनक्स (यूएल) से प्रकट करेंगे। |
जब आप स्क्रिप्ट के फ़ाइल नाम को किसी दुभाषिया (श, अजगर, पर्ल, आदि) में पास करके चलाते हैं, तो आप वास्तव में दुभाषिया को निष्पादित कर रहे हैं, उस कार्यक्रम को पारित करना जिसे आप एक तर्क के रूप में निष्पादित करना चाहते हैं। उदाहरण के लिए, हम गलत व्याख्या को पारित करके श दुभाषिया चलाते हैं। तर्क।
श गलत
यदि आप स्क्रिप्ट को स्वयं चलाते हैं, तो सिस्टम उस दुभाषिया को बुलाएगा जिसे उसकी आवश्यकता है और फिर, हाँ, यह स्क्रिप्ट को निष्पादित करेगा, इसे दुभाषिया के तर्क के रूप में पारित करेगा, लेकिन सभी स्वचालित रूप से और बिना उपयोगकर्ता के जिसने स्क्रिप्ट को निष्पादित किया है।
./myscript.sh
स्क्रिप्ट को स्वयं चलाने के लिए, 2 शर्तें पूरी करनी होंगी:
1) स्क्रिप्ट में "बैंग लाइन" शामिल होना चाहिए। यह एक स्क्रिप्ट की पहली पंक्ति है, जो कि अक्षर # से शुरू होनी चाहिए! और यह कि आपको उस मार्ग को निर्दिष्ट करना होगा जहाँ दुभाषिया स्थित है। यह ध्यान रखना महत्वपूर्ण है कि यह स्थिति किसी भी प्रकार की स्क्रिप्ट (अजगर, पर्ल, आदि) के लिए सही है, न कि केवल उन लोगों के लिए जो बैश हैं।
इस प्रकार, उदाहरण के लिए, हमारी स्क्रिप्ट में निम्नलिखित पहली पंक्ति के रूप में होनी चाहिए:
#! / Bin / bash
2) फ़ाइल में अनुमतियाँ होनी चाहिए:
हमारी स्क्रिप्ट को निष्पादन की अनुमति देने के लिए, हमें लिखना होगा:
chmod a + x miscript.sh
तैयार है, अब इसे इस तरह से चलाएं:
./myscript.sh
या स्क्रिप्ट को एक "विशेष" पथ पर कॉपी करके जो इसे आसानी से लागू करने की अनुमति देता है। उदाहरण के लिए, हम इसे / usr / sbin पर कॉपी कर सकते हैं और इसे पूर्ण पथ को शामिल किए बिना कहीं से भी चला सकते हैं जहाँ यह स्थित है:
हम नकल करते हैं:
sudo cp miscript.sh / usr / sbin / miscript
हम निष्पादित करते हैं:
गलत धारणा
जैसा कि आप देख सकते हैं, वास्तव में पर्दे के पीछे क्या होता है दोनों मामलों में बहुत समान है। हालांकि, एक "बैंग लाइन" को शामिल करने से, आपकी स्क्रिप्ट को वितरित करना बहुत आसान हो जाएगा, क्योंकि उपयोगकर्ताओं को उस पथ को याद नहीं करना होगा जहां आवश्यक व्याख्याकर्ता उन्हें निष्पादित करने में सक्षम होने के लिए स्थित हैं। निष्कर्ष: यह मूल रूप से आराम का सवाल है।
मैं आपसे सहमत हूं, दुभाषिया का संस्करण और उसका रास्ता दोनों ही परिवर्तनशील हैं और स्थिर नहीं हैं, और भी अधिक अगर यह माना जाता है कि GNU / Linux वितरण केवल बश का उपयोग करने वाले नहीं हैं (वहाँ भी हैं: freeBSD, OpenSolaris , मैक) और उनमें से कई के पास अलग-अलग कॉन्फ़िगरेशन या मार्ग हैं।
महत्वपूर्ण बात यह जानना है कि स्क्रिप्ट में कॉल के साथ खेलने के लिए आपके पास लचीलापन है (जैसा कि आपने अच्छी तरह से उल्लेख किया है) या तो ./ या sh (या अजगर ... आदि) के साथ खेलना है।
बैश एक कंप्यूटर प्रोग्राम है जिसका कार्य आदेशों की व्याख्या करना है।
यह यूनिक्स शेल पर आधारित है और पोसिक्स कंप्लेंट है।
इसके बजाय श एक कंप्यूटर प्रोग्राम है जिसका कार्य आदेशों की व्याख्या करना है।
प्रक्रिया नियंत्रण, पुनर्निर्देशन जैसी सुविधाओं को शामिल करता है
इनपुट / आउटपुट, फ़ाइल लिस्टिंग और रीडिंग, सुरक्षा,
द्वारा प्रोग्राम लिखने के लिए संचार और एक कमांड भाषा
बैच या स्क्रिप्ट। यह यूनिक्स के पहले संस्करणों में प्रयुक्त दुभाषिया था और यह एक वास्तविक मानक बन गया।
नमस्कार, मैं स्क्रिप्ट के उपयोग में एक शुरुआत हूं और मैं जानना चाहूंगा कि क्या कोई मेरी समस्या के साथ मेरी मदद कर सकता है:
मैं एक ऐसे प्रोग्राम का प्रबंधन कर रहा हूं जिसमें कंसोल के माध्यम से कई प्रारंभिक डेटा को शामिल करने की आवश्यकता होती है और मुझे पता चला कि स्क्रिप्ट के माध्यम से प्रोग्राम को प्रारंभिक डेटा के साथ निष्पादित करना संभव है, इसलिए जब मैं बार-बार इसे लिखने की जरूरत नहीं है। कार्यक्रम चलाने की जरूरत है।
मुझे नहीं पता कि यह कैसे करना है, इसलिए अगर कोई मेरी मदद कर सकता है तो मैं बहुत आभारी रहूंगा।
देखें, यह निर्भर करता है कि आप किस प्रोग्रामिंग भाषा में स्क्रिप्ट लिख रहे हैं। हालांकि, किसी भी मामले में आपको क्या चाहिए:
1) यदि आप चाहते हैं कि उपयोगकर्ता को जब भी स्क्रिप्ट निष्पादित की जाए तो उस डेटा को दर्ज करना होगा, सबसे सामान्य प्रक्रिया एक चर के लिए इनपुट में दर्ज किए गए मानों को लेना है।
2) मामले में मान हमेशा समान होते हैं, आप स्थिरांक का उपयोग कर सकते हैं।
3) एक अन्य विकल्प यह संभावना है कि आपकी स्क्रिप्ट पैरामीटर ले सकती है।
चियर्स! पॉल।
यह दिलचस्प है कि आप क्या उल्लेख करते हैं। इसे 2 रूपों से कहा जाता है: शेलबैंग लाइन या सीधे बैंग लाइन। मैं आपको जानकारी देता हूं: http://python.about.com/od/programmingglossary/g/defbangline.htm
चियर्स! पॉल।
दिलचस्प है, मैं उस विस्तार के बारे में सोचना बंद नहीं किया था। अधिक कर्णप्रिय छेड़छाड़ वाले लेखों को देखना दिलचस्प होगा, जिनमें प्रसिद्ध कर्नेल पुनर्मूल्यांकन शामिल है, जो अनावश्यक कोड के किलो को हटाने के लिए हैं जो केवल संगतता के लिए हैं और सिस्टम की गति में सुधार करते हैं।
ठीक है। में इसे याद रखूंगा।
चियर्स! पॉल।
मुझे खुशी है कि इसने काम किया। मैं हमेशा उन चीजों को पोस्ट करने की कोशिश करता हूं जो मुझे लगता है कि दिलचस्प और व्यावहारिक हो सकता है।
गले लगना! पॉल।
अच्छी आदतों वाला प्रत्येक प्रोग्रामर कोड की पहली पंक्ति में "बैंग लाइन" जोड़ता है। पायथन में मैं कोडिंग और बैंग लाइन को कभी नहीं भूलता।
#! / usr / बिन / python2.7
* *। * एन्कोडिंग = utf-8 *।
बहुत बढ़िया, उम्मीद है कि आप कमांड लाइन के बारे में अधिक जानकारी प्रकाशित कर सकते हैं, खासकर जब यह स्रोत फ़ाइलों (tar.gz, आदि) से संकलन या स्थापित करने की बात आती है।
मैंने "बैंग लाइन" के बारे में कभी नहीं सुना था, मैं हमेशा इसे शेबांग के रूप में जानता हूं
http://en.wikipedia.org/wiki/Shebang_%28Unix%29
सादर
दिलचस्प नोट ... धन्यवाद!
कितना दिलचस्प है, मैं प्रोग्रामिंग में खुद को पूरी तरह से अज्ञानी घोषित करता हूं और स्क्रिप्ट से संबंधित सब कुछ, मुझे नहीं पता था कि यह कैसे काम करता है, लेकिन मैंने देखा है कि कुछ में हेडर है।
एक स्पष्टीकरण जो मुझे हुआ कि इस प्रविष्टि के साथ क्या करना है: मैं एक एडोब एयर गैजेट (एक पोकर ऑड्स कैलकुलेटर) स्थापित करना चाहता था। एडोब एयर इंस्टॉलर क्या करता है "स्क्रिप्ट" के साथ संबंधित स्क्रिप्ट को रन करें, लेकिन फॉर्म में। / रूट पासवर्ड के लिए आपसे पूछ रहा है। चूंकि स्क्रिप्ट में निष्पादन की अनुमति नहीं थी, इसलिए उसने अनुमति को अस्वीकार कर दिया, समाधान: स्क्रिप्ट को श के साथ चलाएं यदि आप अनुमतियों को बदलना नहीं चाहते हैं (तेजी से tmp chmod फ़ोल्डर और उस सब पर जाने से)। वहां स्क्रिप्ट को निष्पादित किया जाता है, इसे एडोब इंस्टॉलर और एक अन्य तितली चीज़ कहते हैं।
बहुत ही रोचक लेख! मुझे सांत्वना के बारे में थोड़ा और जानने में मदद करने के लिए धन्यवाद। देखते हैं कि आप इन ^ ^ जैसे लेखों को प्रकाशित करते रहते हैं या नहीं।
इसे जारी रखो, यह एक शक के बिना मेरा पसंदीदा ब्लॉग है !!
ध्यान रखें कि उपयोग किए जाने वाले दुभाषिया के संस्करणों के बीच अंतर हो सकता है। शेबबैंग के अनुसार स्क्रिप्ट को सीधे चलाना यह इंगित करने का कोई तरीका नहीं है कि दुभाषिया के किस संस्करण का उपयोग करना है, जो आवश्यक हो सकता है। यदि आप इसके बजाय दुभाषिया चलाते हैं और स्क्रिप्ट को पैरामीटर के रूप में पास करते हैं, तो आप जानते हैं कि इसका कौन सा संस्करण चल रहा है।
उदाहरण के लिए, पाइथन में, यदि शेबंग # है! / Usr / bin / python2.4 यदि यह # है! / Usr / bin / python2.6 से अलग कार्यक्रम चलेगा या यदि यह #! / Usr / bin / python है। (जो आमतौर पर पायथन के संस्करण का एक प्रतीकात्मक लिंक है जो डिफ़ॉल्ट रूप से स्थापित और कॉन्फ़िगर किया गया है)। ऐसा इसलिए होता है क्योंकि Python 2.6 में नई कार्यक्षमता है जो Python 2.4 में मौजूद नहीं थी, इसलिए एक स्क्रिप्ट लिखना जो उस कार्यक्षमता का उपयोग करता है एक #! / Usr / bin / python shebang विफल हो जाएगी यदि सिस्टम केवल अजगर 2.4 स्थापित है। इसके बजाय, आप हमेशा स्क्रिप्ट को "python2.4 /path/al/script.py" या "python2.6 /path/al/script.py/ से शुरू करके अपने इच्छित संस्करण के साथ चलाने के लिए बाध्य कर सकते हैं।
शेल स्क्रिप्ट के लिए, आपके द्वारा उपयोग किए जाने वाले शेल के बीच भी अंतर हैं, इसलिए #! / Bin / sh और #! / Bin / bash का उपयोग स्क्रिप्ट के आधार पर अलग-अलग परिणाम हो सकता है। यदि आप ऐसी स्क्रिप्ट का उपयोग करते हुए स्क्रिप्ट लिखते हैं जो केवल bash में मौजूद है, लेकिन एक #! / Bin / sh shebang निर्दिष्ट करती है, तो आपकी स्क्रिप्ट संभवतः लिनक्स पर काम करेगी (अधिकांश वितरण / बिन / श में बैश के लिए एक प्रतीकात्मक लिंक है) लेकिन यह संभवतः विफल हो जाएगी अन्य यूनिक्स में जहां बैश स्थापित नहीं है या जहां / बिन / श / / बिन / बैश का प्रतीकात्मक लिंक नहीं है।
पोर्टेबिलिटी से संबंधित, यह भी ध्यान में रखा जाना चाहिए कि शेबंग में संकेतित मार्ग निरपेक्ष है, और ऐसे समय होते हैं जब दुभाषियों को अन्य स्थानों पर स्थापित किया जाता है। उदाहरण के लिए, यदि आपने अपने वितरण से पैकेज का उपयोग करने के बजाय पायथन को डाउनलोड और संकलित किया है, तो अजगर इंटरप्रेटर को / usr / लोकल / बिन / पायथन में स्थापित किया जाना आम है। यदि आपका शेबंग #! / Usr / bin / python है, तो स्क्रिप्ट उन सिस्टम पर काम नहीं करेगी। इन समस्याओं से बचने के लिए, आप शेबंग "#! / Usr / bin / env python" (या "#! / Usr / bin / env sh") के रूप में उपयोग कर सकते हैं जैसा कि समझाया गया है। http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability
धन्यवाद जोनाथन! आपको टिप्पणी देखकर अच्छा लगा!
चियर्स! पॉल।
कहीं भी वह नहीं है जो मैं जानना चाहता हूं, या कम से कम मुझे नहीं पता कि इसे खोज इंजन में कैसे उठाया जाए, मैं एक स्क्रिप्ट बनाना चाहता हूं कि एक कारण के लिए xX कमांड एप्टीट्यूड या «सु» निष्पादित करता है (यह केवल एक उदाहरण है लेकिन वे 2 मामले हैं जो मैं सोच सकता हूं) और योग्यता के मामले में कभी-कभी यह मुझे "योन" दर्ज करने के लिए कहता है या "सु" में मुझसे पासवर्ड मांगता है ... मैं इन विकल्पों का चयन करने के लिए स्क्रिप्ट चाहूंगा स्वचालित रूप से या तो एक पैरामीटर पास करके या कुछ विधि का उपयोग करके जिसे वह नहीं जानता है ...। ध्यान देने के लिए धन्यवाद
नमस्कार एंटोनियो! यदि आपकी समस्या पासवर्ड दर्ज करने की है, तो मुझे नहीं लगता कि कोई समाधान है। ठीक है क्योंकि यह एक सुरक्षा उपाय है, ताकि हर कोई एक कार्यक्रम स्थापित न कर सके।
योग्यता के बारे में और हां डालने के बारे में, मुझे लगता है कि इसे हल किया जा सकता है। मुझे इस बिंदु पर याद नहीं है कि उपयोग करने के लिए सटीक पैरामीटर है, लेकिन सिर्फ मैन पेजों में पता करें। एक टर्मिनल खोलें और कमांड दर्ज करें: आदमी योग्यता।
झप्पी! पॉल
बहुत अच्छी पोस्ट।
मुझे यह विशेष रूप से पसंद आया है- यह सवाल / संदेह जो उत्पन्न होता है, उसका उत्तर बहुत स्पष्ट और संक्षिप्त रूप से दिया जाता है।