पर्यावरण चर काम नहीं करने के लिए BASH स्क्रिप्ट


136

मैंने जरूरत पड़ने पर कुछ पर्यावरण चर निर्धारित करने के लिए निम्न स्क्रिप्ट लिखी है।

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

कमांड और परिणाम के नीचे मैं अपने टर्मिनल पर देख सकता हूं: स्क्रिप्ट चलती है, लेकिन अंत में चर सेट नहीं होते हैं।

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

क्या गलत है? अग्रिम में धन्यवाद। मिरको

जवाबों:


192

exportशेल की बाल प्रक्रियाओं के लिए चर असाइनमेंट निर्यात करता है जिसमें exportकमांड चलाया गया था। आपका कमांड-लाइन वातावरण स्क्रिप्ट के शेल का जनक है, इसलिए यह चर असाइनमेंट नहीं देखता है।

आप वर्तमान शेल वातावरण में स्क्रिप्ट कमांड को निष्पादित करने और जो आप चाहते हैं, जैसे हासिल करने के लिए .(या source) बैश कमांड का उपयोग कर सकते हैं

source ./script.sh
echo "$BASE"

उत्पादन करेंगे

/home/develop/trees

sourceआदेश, अक्सर लिपियों में देखा, के लिए एक पार्टी पर्याय है ., जो POSIX मानक का हिस्सा है (ताकि .उदाहरण के लिए, पानी का छींटा में उपलब्ध है, लेकिन sourceनहीं है)।

. ./script.sh     # identical to "source ./script.sh"

( . script.shऔर source script.shपहले के लिए दिखेगा script.shमें PATH, तो यह करने के लिए पथ निर्दिष्ट करने के लिए सुरक्षित है script.sh।)


29
आपको exportउप-श्रेणियों में चर पास करने की आवश्यकता नहीं है , एक उपधारा आपके वर्तमान शेल की एक प्रति है, जिसमें चर और फ़ंक्शन आदि शामिल हैं। निर्यात किए गए चर शेल से खोली गई नई प्रक्रियाओं की प्रतिलिपि बन जाते हैं, भले ही उस प्रक्रिया को कोई अन्य शेल हो या न हो। दूसरे, .सोर्सिंग के लिए POSIX कमांड है। बैश इसके लिए sourceएक अधिक पठनीय पर्याय के रूप में जोड़ता है, लेकिन आप इसे श में उपलब्ध होने पर भरोसा नहीं कर सकते। अंत में . ./scriptइसके बजाय . scriptअगर आप आश्चर्य से बचना चाहते हैं। mywiki.wooledge.org/BashFAQ/060
जिरह 5:18 बजे

ध्यान दें कि यदि आप कोई स्क्रिप्ट बनाते हैं और पाइप का उपयोग करते हैं, तो अभिभावक को खट्टा वातावरण उपलब्ध नहीं होता है। उदाहरण के लिए 'source setit.sh' ठीक है। 'source setit.sh | tee setit.log' ठीक नहीं है। चौंका देने वाला। सहज नहीं है।
गौथे से

10

जब आप किसी स्क्रिप्ट को चलाते हैं, तो वह सबस्क्रिप्शन में चलती है। चर केवल उस उपधारा के संदर्भ में मान्य हैं। उन्हें अपने .bashrcया में सेट करें .profileऔर चर और उपधाराओं पर पढ़ें । यह exportकथन पदानुक्रम (वर्तमान शेल और इसके सभी उपखंड हैं) के नीचे काम करता है न कि आपके उदाहरण में।

वैकल्पिक रूप से (यदि आप वास्तव में स्क्रिप्ट को अपने वर्तमान शेल के संवर्धन को प्रभावित करना चाहते हैं)

. ./script.sh

यह आपके वर्तमान शेल में चलने का कारण बनता है लेकिन पदानुक्रम तक चर को पारित नहीं करेगा।


5

मैं अक्सर परेशानी के बिना एक पर्यावरण चर सेट करना चाहता हूं।

इस सुविधा को लागू करने के लिए मैं अपने .bashrc में यही जोड़ता हूं।

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}

-1

आप कुछ इस तरह की कोशिश कर सकते हैं

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.