पुनः लोड करें। बैश शेल स्क्रिप्ट में (यूनिक्स में)।


130

मैं शेल स्क्रिप्टिंग के लिए नया हूं, और एक चुनौती भर आया हूं। मुझे पता है कि मैं अपनी ".profile" फ़ाइल को फिर से लोड कर सकता हूं:

. .profile

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

धन्यवाद


जैसा कि इग्नासियो नीचे बताती है, आपकी स्क्रिप्ट एक सब-टाइम में चल रही है। उपधारा मुख्य शेल को संशोधित नहीं कर सकती (बच्चे की प्रक्रिया अपने माता-पिता को संशोधित नहीं कर सकती)। इसलिए आपको "का उपयोग करके स्क्रिप्ट को" स्रोत "करने की आवश्यकता है।" कमांड (जिसे "स्रोत" के रूप में भी लिखा जा सकता है)। इसलिए यदि आपकी स्क्रिप्ट पर्यावरण चर को कहना, संशोधित करना चाहती है, तो आपको "स्रोत myscript" या "myscript" जैसा कुछ करने की आवश्यकता है (वे दोनों का मतलब समान है)। यह आपके मुख्य शेल के वातावरण को संशोधित करेगा। (जो मुझे लगता है कि आप क्या करने की कोशिश कर रहे हैं, मुझे बताएं कि क्या यह गलत है।)
bstpierre

1
मुझे आपके सवाल का जवाब मिल गया :)
कोलोब कैनियन

जवाबों:


195

अपने वर्तमान शेल को पुनः लोड करने के लिए यह प्रयास करें:

source ~/.profile

1
क्या आपके पास कोई वैकल्पिक उपाय है? क्योंकि sourceकमांड का उपयोग करने से फाइल एक स्क्रिप्ट के रूप में चलेगी ... सबसे खराब स्थिति में, अगर कोई MyVar="$foo$MyVar"अपने bash_profile की तरह एक चर असाइनमेंट का उपयोग करेगा , तो source ~/.profileअंतिम परिणाम देगा MyVar="$foo$MyVar$MyVar", इसलिए $MyVarबाद में गलत मान होगा। (बुरी प्रथाओं के बावजूद, बस एक वैकल्पिक समाधान के लिए पूछें)
जेफरी मवुतु माबिलमा


5

समस्याओं का एक जोड़ा उठता है जब / स्रोत को पुनः लोड करने की कोशिश कर रहा है ~ / .profile फ़ाइल। [यह उबंटू लिनक्स को संदर्भित करता है - कुछ मामलों में आदेशों का विवरण अलग होगा]

  1. क्या आप इसे सीधे टर्मिनल या स्क्रिप्ट में चला रहे हैं?
  2. आप इसे एक स्क्रिप्ट में कैसे चलाते हैं?

विज्ञापन। 1)

इसे सीधे टर्मिनल में चलाने का मतलब है कि कोई उप-आधार नहीं बनाया जाएगा। तो आप दो कमांड का उपयोग कर सकते हैं:

source ~/.bash_profile

या

. ~/.bash_profile

दोनों ही मामलों में यह .profile फ़ाइल की सामग्री के साथ पर्यावरण को अद्यतन करेगा।

Ad 2) आप कॉल करके या तो कोई भी बैश स्क्रिप्ट शुरू कर सकते हैं

sh myscript.sh 

या

. myscript.sh

पहले मामले में यह एक सबस्क्रिप्शन बनाएगा जो आपके सिस्टम के पर्यावरण चर को प्रभावित नहीं करेगा और वे केवल सब-प्रोसेस प्रक्रिया के लिए दिखाई देंगे। उपधारा आदेश समाप्त करने के बाद निर्यात आदि में से कोई भी लागू नहीं किया जाएगा। यह एक इतिहास है और समय की एक बहुत खो जाने के लिए विकासकर्ताओं की एक बहुत कुछ है।

वैश्विक वातावरण के प्रभाव के लिए आपकी स्क्रिप्ट में लागू किए गए आपके परिवर्तनों के लिए स्क्रिप्ट के साथ चलना होगा

.myscript.sh

आदेश।

यह सुनिश्चित करने के लिए कि आप स्क्रिप्ट उप-भाग में नहीं चल रहे हैं आप इस फ़ंक्शन का उपयोग कर सकते हैं। (फिर से उदाहरण उबंटू खोल के लिए है)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

मुझे आशा है कि यह कुछ सामान्य गलतफहमियों को दूर करता है! : डी गुड लक!


4

बैश स्क्रिप्ट एक अलग उपधारा में चलती है। इस काम को करने के लिए आपको इस अन्य स्क्रिप्ट को भी स्रोत बनाने की आवश्यकता होगी।


मुझे यकीन नहीं है (अभी भी इस सब के लिए नया) क्या आप वास्तव में "स्रोत" से मतलब है - अन्य स्क्रिप्ट। कृपया उस पर थोड़ा विस्तार कर सकते हैं। हालाँकि मैंने कोशिश की है: $। ~ /। लाभकारी $। / etc / प्रोफ़ाइल बिना किसी सफलता के। बहुत बहुत धन्यवाद।
अमीर रुस्तमजादेह

1
@amirrustan: आपकी स्क्रिप्ट को आपकी .profileफ़ाइल को कुछ इस तरह से स्रोत करने की आवश्यकता होगी : . $HOME/.profileऔर आपको अपनी स्क्रिप्ट को भी सोर्स करके शुरू करना होगा। कुछ और जैसे. /path/to/yourscript
अगली सूचना तक रोक दिया गया।

1
@amirrustam कृपया superuser.com/questions/176783/…
lesmana

1

प्रयत्न:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.