2009-01-07 17 views
10

मैं क्या करना चाहता हूं कि फ़ाइल से सेटिंग्स को मेरे वर्तमान इंटरैक्टिव बैश खोल में शामिल करना है:एक बैश स्क्रिप्ट उस निर्देशिका को कैसे जान सकती है जब इसे सोर्स किया जाता है। ऑपरेटर?

$। /path/to/some/dir/.settings

समस्या यह है कि .settings स्क्रिप्ट को "।" इस तरह की अन्य फाइलों को शामिल करने के लिए ऑपरेटर:

। .extra_settings

मैं .settings फ़ाइल में .extra_settings के सापेक्ष पथ का संदर्भ कैसे दूं? ये दो फाइलें हमेशा एक ही निर्देशिका में संग्रहीत होती हैं, लेकिन इन फ़ाइलों को स्थापित करने के आधार पर इस निर्देशिका का पथ अलग होगा।

ऑपरेटर हमेशा ऊपर दिखाए गए अनुसार/पथ/से/कुछ/डीआईआर/जानता है। .settings फ़ाइल निर्देशिका को कहां स्थापित कर सकती है? मेरे पास एक इंस्टॉल प्रक्रिया नहीं होगी जो स्थापित निर्देशिका के नाम को रिकॉर्ड करेगी।

उत्तर

17

से प्राप्त गोले समर्थन करने के लिए मैं, विश्वास है $(dirname "$BASH_SOURCE") तुम क्या चाहते हो जाएगा बनाता है जब तक कि फ़ाइल आप सोर्सिंग कर रहे हैं नहीं एक सिमलिंक है।

फ़ाइल आप एक सिमलिंक हो सकता है सोर्सिंग कर रहे हैं, आप की तरह कुछ कर सकते हैं अगर सही निर्देशिका पाने के लिए निम्नलिखित:

PRG="$BASH_SOURCE" 
progname=`basename "$BASH_SOURCE"` 

while [ -h "$PRG" ] ; do 
    ls=`ls -ld "$PRG"` 
    link=`expr "$ls" : '.*-> \(.*\)$'` 
    if expr "$link" : '/.*' > /dev/null; then 
     PRG="$link" 
    else 
     PRG=`dirname "$PRG"`"/$link" 
    fi 
done 

dir=$(dirname "$PRG") 
+0

बिल्कुल सही। $ (dirname "$ BASH_SOURCE") वही है जो मैं वही था जो मैं खोज रहा था। मेरे उद्देश्य के लिए, मुझे symlinks के बारे में बहुत परवाह नहीं है। जवाब देने वाले सभी के लिए धन्यवाद। यहां वास्तव में अच्छे जवाब हैं। – Gary

+8

सिम्लिंक को हल करने के लिए आप बस ऐसा कर सकते हैं: 'dir = $ (dirname $ (readlink -f" $ BASH_SOURCE ")) –

0

मैंने $ (dirname $ 0) के रूपों के साथ गड़बड़ करने की कोशिश की लेकिन यह विफल रहता है जब .settings फ़ाइल "।" के साथ शामिल होती है। अगर मैं इसे शामिल करने के बजाय .settings फ़ाइल निष्पादित कर रहा था, तो यह समाधान काम करेगा। इसके बजाए, $ (dirname $ 0) हमेशा "।" लौटाता है, जिसका अर्थ है वर्तमान निर्देशिका। यह ऐसा करने में विफल रहता है:

$ सीडी/ $। /some/path/.settings

+0

हम्म, बहुत बुरा। मुझे नहीं पता कि –

2

समस्या पर एक अलग लेना - यदि आप "।" का उपयोग कर रहे हैं।

eval $(/path/to/settings.sh) 

कि कैसे संकुल modules काम की तरह:

# settings.sh 
echo export CLASSPATH=${CLASSPATH}:/foo/bar 

तो उत्पादन eval: वातावरण चर सेट करने के लिए, यह करने के लिए एक और मानक तरीका चर सेटिंग आदेशों गूंज अपनी स्क्रिप्ट, जैसे है । इस तरह से भी आसान श (X=...; export X) और csh (setenv X ...)

+0

ठीक है, इस तरह आईएनएन यह करता है। "innconfvar" (मुझे लगता है कि यह जिसे कहा जाता है) कॉन्फ़िगरेशन चर को sh, csh या perl कमांड के रूप में उत्सर्जित करता है। –

+0

मुझे यह विचार पसंद है। हालांकि, मैं इसका उपयोग नहीं कर रहा हूं क्योंकि साइड इफेक्ट्स .settings फ़ाइल को और भी अपठनीय बना देगा क्योंकि इससे पहले से शुरू होने के लिए बहुत से भाग निकलते हैं। निचे देखो। – Gary

0

काम करता है इस तरह की। यह इस अर्थ में काम करता है कि आप अपने घर को निर्धारित करने के लिए .settings फ़ाइल के भीतर $ (dirname $ 0) वाक्यविन्यास का उपयोग कर सकते हैं क्योंकि आप इस स्क्रिप्ट को नए खोल में निष्पादित कर रहे हैं।

export MYDATE=$(date) 

echo "export MYDATE=\$(date)" 

हो सकता है कि यह एक ही रास्ता है करने के लिए: हालांकि, यह घुमाव के की अतिरिक्त परत जहाँ आप इस तरह के रूप लाइनों को बदलने की जरूरत कहते हैं?

script_dir=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) 

यह नहीं है, तथापि, काम जब लिंक सोर्सिंग होगा:

+0

ऐसा लगता है कि यदि आप शैल फ़ंक्शंस में सोर्सिंग कर रहे थे तो यह जटिलता भी जोड़ देगा। (मैं ऐसा करने का एक तरीका ढूंढ रहा था जो किश और बैश दोनों के साथ काम करता है ...) – mpontillo

6

यहाँ एक सुरुचिपूर्ण समाधान हो सकता है।उस मामले में, कोई एक कार्य करें

script_dir=$(readlink -f $(readlink "${BASH_SOURCE[0]}") 

बर्तन कि ${array[x]} तरह सरणियों अनुरूप POSIX नहीं कर रहे हैं हो सकता है। बेशक, BASH_SOURCE सरणी केवल बैश में उपलब्ध है।

+0

'[0] 'की आवश्यकता क्यों होगी? @ जेसनडे के पास उसके जवाब में नहीं है। – asmeurer

+3

BASH_SOURCE वर्तमान में निष्पादित स्क्रिप्ट होने वाले पहले तत्व के साथ कॉल स्टैक का प्रतिनिधित्व करने वाला एक सरणी है। –

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

  • कोई संबंधित समस्या नहीं^_^