Использование точки(.
)в ваших каталогах делает их относительными к точке "этот каталог" (pwd ).
Если вы не возражаете против статических каталогов (относительно пользовательского каталога (~)), вы можете использовать:
source ~/bin/modules/script-x # or equivalent:. ~/bin/modules/script-x
Если вам нужны каталоги относительно каталога, в котором было запущено основное -приложение (любой каталог ), вы можете использовать (в bash):
source "${BASH_SOURCE%/*}/modules/script-x"
Или во многих оболочках:
source "$(basename "$0")/modules/script-x"
Это $0
будет работать при условии, что способ вызова основного -приложения заставит имя, указанное в списке ps, содержать правильный путь к файлу. Это не всегда так:
$ exec -atestname /bin/bash
$ echo "$0"
testname
Если ваш каталог может содержать ссылки и вам нужен канонический путь (без ссылок или относительных (.. )используемые имена ), используйте:
source "$(basename "$(readlink -f -- "$BASH_SOURCE")" )/modules/script-x"
Или замените "$BASH_SOURCE"
на "$0"
(, если необходимо ).
Обратите внимание :, что в некоторых крайних случаях вам может понадобиться использовать realpath
вместоreadlink -f
Или просто cd
в правильный каталог (избегайте readlink или realpath):
source "$( cd "${BASH_SOURCE%/*}" > /dev/null && pwd )/modules/script-x"
Таблицы имен имеют историческое происхождение:
История, изложенная выше, кратко описана здесь :https://netfilter.org/about.html#history.