समस्या
महत्वपूर्ण रूप से स्वीकृत उत्तर केवल महत्वपूर्ण स्थिति में काम करता है। दिया हुआ...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
तथा
/foo/bar/second.sh:
#!/bin/bash
source ./first.sh
func1 World
यह केवल तभी काम करता है जब इसे first.shउसी निर्देशिका के भीतर से निष्पादित किया first.shजाता है जहां स्थित है। अर्थात। यदि शेल का वर्तमान कार्य पथ है /foo, तो कमांड चलाने का प्रयास
cd /foo
./bar/second.sh
प्रिंट त्रुटि:
/foo/bar/second.sh: line 4: func1: command not found
ऐसा इसलिए है क्योंकि यह source ./first.shवर्तमान कार्य पथ के सापेक्ष है, लिपि का मार्ग नहीं। इसलिए एक समाधान सबस्क्रिप्शन और रन का उपयोग करने के लिए हो सकता है
(cd /foo/bar; ./second.sh)
अधिक सामान्य समाधान
दिया हुआ...
/foo/bar/first.sh:
function func1 {
echo "Hello $1"
}
तथा
/foo/bar/second.sh:
#!/bin/bash
source $(dirname "$0")/first.sh
func1 World
फिर
cd /foo
./bar/second.sh
प्रिंट
Hello World
यह काम किस प्रकार करता है
$0 निष्पादित स्क्रिप्ट के सापेक्ष या निरपेक्ष पथ देता है
dirname निर्देशिका के सापेक्ष पथ देता है, जहां $ 0 स्क्रिप्ट मौजूद है
$( dirname "$0" )dirname "$0"आदेश निष्पादित स्क्रिप्ट है, जो तब के लिए तर्क के रूप में प्रयोग किया जाता है की सूची के सापेक्ष पथ रिटर्न sourceआदेश
- "second.sh" में,
/first.shकेवल आयातित शेल स्क्रिप्ट का नाम जोड़ा गया है
source वर्तमान शेल में निर्दिष्ट फ़ाइल की सामग्री लोड करता है