2010-07-18 25 views
98

मैं शेल स्क्रिप्टिंग को बाश करने के लिए नया हूं, और एक चुनौती में आया हूं। मैं जानता हूँ कि मैं सिर्फ ऐसा करने से मेरी ".profile" फाइल को फिर से लोड कर सकते हैं:बैश खोल स्क्रिप्ट (यूनिक्स में) में पुनः लोड करें। प्रोफाइल?

. .profile 

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

धन्यवाद

+0

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

+1

मुझे आपके प्रश्न से मेरा जवाब मिला :) –

उत्तर

149

इस प्रयास करें अपने वर्तमान खोल को फिर से लोड करने के लिए:

source ~/.profile 
3

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

+0

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

+1

@amirrustan: आपकी स्क्रिप्ट को आपकी '.profile' फ़ाइल को इस तरह कुछ स्रोत करने की आवश्यकता होगी: '। $ HOME/.profile' और आपको इसे भी सोर्स करके अपनी स्क्रिप्ट शुरू करने की आवश्यकता होगी। कुछ की तरह '।/पथ/से/yourscript' –

+1

@amirrustam कृपया पढ़ें http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash- स्क्रिप्ट/176,788 # 176,788 – lesmana

0

प्रयास करें:

#!/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 [email protected] 
echo my script continues here 
' arg0 "[email protected]" 
1

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

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

विज्ञापन। 1)

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

source ~/.bash_profile 

या

. ~/.bash_profile 

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

विज्ञापन 2) आप या तो

sh myscript.sh 

या

. myscript.sh 

बुला पहले मामले में यह एक subshell इस बात का वातावरण चर को प्रभावित नहीं करेगा बना दिया जाएगा, किसी भी पार्टी स्क्रिप्ट शुरू कर सकते हैं अपने सिस्टम और वे केवल सबहेल प्रक्रिया के लिए दृश्यमान होंगे। सबहेल कमांड को खत्म करने के बाद निर्यात में से कोई भी लागू नहीं किया जाएगा। यह एक आम मिसाल है और कई समय के लिए डेवलपर्स का बहुत कम कारण है।

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

.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 
} 

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

संबंधित मुद्दे