समस्या
महत्वपूर्ण रूप से स्वीकृत उत्तर केवल महत्वपूर्ण स्थिति में काम करता है। दिया हुआ...
/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
वर्तमान शेल में निर्दिष्ट फ़ाइल की सामग्री लोड करता है