बिना स्क्रिप्ट के चालू शेल में चलाएं। कमांड से पहले


26

यदि किसी स्क्रिप्ट को वर्तमान शेल में निष्पादित किया जाना चाहिए, तो इसे कमांड से पहले डॉट जोड़कर प्राप्त किया जा सकता है:

   . ./somescript.sh

क्या हर बार डॉट टाइप किए बिना ऐसा करने का कोई तरीका है? उदाहरण के लिए स्क्रिप्ट से ही मूल शेल में बदलने के लिए एक कमांड?

जवाबों:


22

यह वही नहीं हो सकता है जो आप चाहते हैं लेकिन आप कर सकते हैं:

alias somescript.sh='. ./somescript.sh'

2
इससे मेरी समस्या पूरी तरह हल हो गई। धन्यवाद!
alu

8

क्या हर बार डॉट टाइप किए बिना ऐसा करने का कोई तरीका है? उदाहरण के लिए स्क्रिप्ट से ही मूल शेल में बदलने के लिए एक कमांड?

मुझे नहीं लगता कि (टाइप करने के अलावा source somescript.sh, लेकिन यह है कि शायद आप ^ ^ की तलाश में नहीं हैं)।

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

यदि आप चाहते हैं कि शेल किसी अन्य प्रक्रिया को लॉन्च किए बिना स्क्रिप्ट को स्वयं पढ़े, तो आपको स्पष्ट रूप से .या sourceकीवर्ड का उपयोग करके यह बताना होगा ।


विस्तृत विवरण के लिए धन्यवाद। :) अब मैं देख रहा हूं कि इसे तथाकथित स्क्रिप्ट से ऐसा करने का कोई तरीका नहीं है, लेकिन सौभाग्य से माता-पिता को बताया जा सकता है कि aliasकमांड के साथ एक उपधारा नहीं बनाया जाए , जैसे कि स्कॉट का सुझाव दिया गया है।
alu

1

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

(ठीक है, ठीक है, आप सबप्रोसेस से डिबगर चला सकते हैं और पेरेंट प्रोसेस की मेमोरी को ट्विक कर सकते हैं। लेकिन अगर आप इसे आजमाते हैं, तो सबसे अधिक संभावना है कि परिणाम पेरेंट शेल को क्रैश कर रहा है।)

आपको दौड़ने की जरूरत है . ./somescript.sh। यदि आप चाहें, तो आप इसे एक उपनाम या फ़ंक्शन के पीछे छिपा सकते हैं, लेकिन फिर से मूल नाम में उपनाम या फ़ंक्शन की परिभाषा करनी होगी।


0

मुझे लगता है कि जिस स्क्रिप्ट को आप चलाने की कोशिश कर रहे हैं, वह निष्पादन योग्य नहीं है। chmod a+x somescript.shउस फ़ाइल में उपयोगकर्ता, समूह और अन्य (ugo) के लिए निष्पादन बिट को जोड़ देगा। फ़ाइल की पहली पंक्ति को भी # की आवश्यकता होगी! शीर्ष पर लाइन, जैसे #!/bin/bash

ls -l somescript.shआपको फ़ाइल के लिए rwx ट्रिपल (रीड / राइट / एक्ज़ीक्यूट) दिखाएगा। आपको कम से कम पहले सेट में एक x की आवश्यकता होगी, यह मानते हुए कि आप फ़ाइल के मालिक हैं।


स्क्रिप्ट स्वयं ठीक काम करती है, लेकिन मैं इसे शेल के पर्यावरण चर को संशोधित करने में सक्षम होने के लिए मौजूदा शेल में निष्पादित करना चाहता हूं।
alu

यदि आप जिस स्क्रिप्ट में स्क्रिप्ट चाहते हैं उसका निर्यात नहीं कर रहे हैं, export PATH=$PATH:/usr/local/binअपने $ PATH में / usr / लोकल / बिन को जोड़ना पसंद करते हैं, तो आपको अपने चल रहे पर्यावरण चर को बदलने के लिए फ़ाइल को स्रोत करने की आवश्यकता है। यह प्रश्न वास्तव में है "मैं कैसे एक बैश स्क्रिप्ट से अपने चल रहे शेल में अपने पर्यावरण चर को प्रोग्रामेटिक रूप से बदल सकता हूं?" स्क्रिप्ट . ./somescript.shठीक ही निष्पादित हो रही है - आप एक फ़ाइल में स्रोत के लिए डॉट कमांड का उपयोग कर रहे हैं। tcsh उसी चीज़ के लिए "स्रोत" का उपयोग करता है।
एआर डिडेरिच

एक चर को संशोधित करना केवल एक उदाहरण था। मेरा प्रश्न यह है कि क्या शेल को बताना संभव है कि वास्तव में इसे लिखने के बिना एक बिंदी होनी चाहिए (उदाहरण के लिए स्वयं लिपि से)
alu

डॉट को आसानी से भुलाया जा सकता है जो स्क्रिप्ट के व्यवहार को पूरी तरह से बदल सकता है।
alu

0
export PATH=$PATH:.

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

यह आपको मौजूदा निर्देशिका में किसी भी निष्पादन योग्य को चलाने की अनुमति देगा ./


1
ओपी पहले के बारे में पूछ रहा .है ./कि फ़ाइलनाम का हिस्सा नहीं है । रनिंग ।/scriptcript वर्तमान शेल में इसे निष्पादित नहीं . ./somescriptकरता है जैसा कि करता है।
एंथन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.