स्क्रिप्ट निष्पादित करने के सापेक्ष एक फ़ाइल का जिक्र


94

एक बैश स्क्रिप्ट में जो मैं लिख रहा हूं, मैं sourceएक कॉन्फ़िगरेशन फ़ाइल में परिभाषित चर को शामिल करने के लिए उपयोग करता हूं । स्क्रिप्ट को निष्पादित किया जाना है act.sh, जबकि स्क्रिप्ट sourceडी होना है act.conf.sh, इसलिए act.shमेरे पास है:

source act.conf.sh

हालाँकि, यह केवल act.shउस निर्देशिका में काम करता है, जिसमें यह सम्‍मिलित है, क्योंकि act.conf.shवहाँ कार्यशील निर्देशिका के अंतर्गत रखी गई फ़ाइल को संदर्भित करता है। क्या ऐसा करने का कोई समाधान है जो फ़ाइल को संदर्भित करने के लिए फ़ाइल को संदर्भित करता है cd? धन्यवाद।

जवाबों:


116

देखें: BASH FAQ प्रविष्टि # 28: "मैं अपनी स्क्रिप्ट का स्थान कैसे निर्धारित करूं? मैं उसी जगह से कुछ कॉन्फिग फाइल पढ़ना चाहता हूं।"

कोई भी समाधान 100% समय पर काम करने वाला नहीं है:

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

यदि आपको एक बहुत ही पुन: प्रयोज्य उपकरण लिखने की आवश्यकता है , तो अपनी स्क्रिप्ट के पैरामीटर के रूप में सही रास्ता लेना सबसे विश्वसनीय तरीका होने जा रहा है

मान लीजिए कि आपकी स्क्रिप्ट केवल कुछ निश्चित गोले से चलने वाली है, और केवल थोड़े लचीलेपन की आवश्यकता है, तो आप शायद इस व्यामोह से कुछ हद तक आराम कर सकते हैं। अपने विकल्पों को देखना अभी भी अच्छा है। ऐसे सामान्य पैटर्न हैं जो लोग उपयोग करते हैं जो विशेष रूप से समस्याग्रस्त हैं।

विशेष रूप से, अक्सर पूछे जाने वाले प्रश्न बहुत सामान्य रूप से उपयोग किए जाने वाले $0चर से बचने की सलाह देते हैं :

जो कुछ भी पढ़ता है $0वह कभी भी बुलेटप्रूफ नहीं होगा, क्योंकि $0खुद अविश्वसनीय है।

एक विकल्प के रूप में, आप $BASH_SOURCEइसके बजाय उपयोग कर सकते हैं । कुछ इस तरह:

source "${BASH_SOURCE%/*}/act.conf.sh"

इस समाधान के लिए कुछ चेतावनी भी हैं। विभिन्न समाधानों के बीच ट्रेड-ऑफ देखने के लिए FAQ पृष्ठ देखें। वे उन मामलों के cdसाथ संयोजन में अनुशंसा $BASH_SOURCEकरते हैं जहां यह आपके लिए काम करेगा, क्योंकि जब आप ठीक से विस्तार करने में विफल हो जाते हैं तो आपको एक त्रुटि की स्थिति मिलती है।


1
धन्यवाद, मैं उपयोग करेंगे readlink। यहाँ पोस्ट किए गए प्रश्न को खोजने के लिए कीवर्ड निर्धारित करने में सक्षम नहीं था ....
रयान ली

9
क्या आप संबंधित सूचना को उस स्थिति में खींच सकते हैं, जब बैश फेक डाउन होता है?
मेरलिन मॉर्गन-ग्राहम

3
लिंक की अनुशंसा करता है: cd "${BASH_SOURCE%/*}" || exitया read somevar < "${BASH_SOURCE%/*}/etc/somefile", लिंक मजबूत रूप से हतोत्साहित करता है $0 "कुछ भी नहीं है कि $ 0 पढ़ता है कभी भी बुलेटप्रूफ होगा, क्योंकि $ 0 स्वयं अविश्वसनीय है।"
ThorSummoner

10
BASH_SOURCE के बाद% / * क्या करता है और कैसे करता है?
Silicomancer


34

इसे देखें: बैश: अन्य स्क्रिप्ट को शामिल करने के लिए कैसे _best_?

मैं उपयोग करने का सुझाव देता हूं:

source $(dirname $0)/act.conf.sh

8
यह वह उत्तर नहीं है जो आप चाहते हैं। $0स्वाभाविक रूप से छोटी गाड़ी है। शीर्ष मतदान क्यों और इसके लिए स्वीकार किए गए उत्तर देखें, या बस mywiki.wooledge.org/BashFAQ/028 पढ़ें - पूछे गए प्रश्न के लिए संक्षिप्त समाधान कुछ इस तरह हैsource "${BASH_SOURCE%/*}/act.conf.sh"
मेरलिन मॉर्गन-ग्राहम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.