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