Проблема
Точно прийнята відповідь працює лише за важливої умови. Враховуючи ...
/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 завантажує вміст зазначеного файлу в поточну оболонку