Проблема
Принятый в настоящее время ответ работает только при важном условии. Дано...
/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 загружает содержимое указанного файла в текущую оболочку