См. Статью № 28 часто задаваемых вопросов BASH: «Как определить местоположение моего скрипта? Я хочу прочитать некоторые файлы конфигурации из того же места».
Ни одно решение не будет работать в 100% случаев:
Важно понимать, что в общем случае эта проблема не имеет решения. Любой подход, о котором вы, возможно, слышали, и любой подход, который будет подробно описан ниже, имеет недостатки и будет работать только в определенных случаях. Прежде всего, постарайтесь полностью избежать проблемы, не полагаясь на местоположение вашего скрипта!
Если вам нужно написать очень многоразовый инструмент, то выбор правильного пути в качестве параметра вашего скрипта будет самым надежным методом .
Предполагая, что ваш скрипт будет запускаться только из определенных оболочек, и только с небольшой необходимой гибкостью, вы, вероятно, сможете немного ослабить эту паранойю. Все еще хорошо рассмотреть ваши варианты. Есть распространенные шаблоны, которые люди используют, и которые вызывают особые проблемы.
В частности, в FAQ рекомендуется избегать очень часто используемой $0
переменной:
Ничто из того, что читает $0
, никогда не будет пуленепробиваемым, потому что $0
само по себе ненадежно.
В качестве альтернативы вы можете использовать $BASH_SOURCE
вместо него. Что-то вроде этого:
source "${BASH_SOURCE%/*}/act.conf.sh"
К этому решению тоже есть некоторые предостережения. Посетите страницу часто задаваемых вопросов, чтобы увидеть компромиссы между различными решениями. Кажется, они рекомендуют cd
в сочетании с $BASH_SOURCE
в тех случаях, когда это сработает для вас, поскольку вы получаете удобное состояние ошибки, когда он не может правильно развернуться.
readlink
. Не удалось определить ключевые слова для поиска, поэтому разместил вопрос здесь ....cd "${BASH_SOURCE%/*}" || exit
илиread somevar < "${BASH_SOURCE%/*}/etc/somefile"
, Ссылка категорически обескураживает$0
«Ничто, что читает $ 0, никогда не будет пуленепробиваемым, потому что $ 0 сам по себе ненадежен».Видеть это: Bash: Как _ лучше_ включать другие сценарии?
Предлагаю использовать:
source $(dirname $0)/act.conf.sh
источник
$0
по своей сути глючит. Посмотрите, почему большинство проголосовало и приняло ответ, или просто прочтите mywiki.wooledge.org/BashFAQ/028 - короткий способ решения заданного вопроса выглядит примерно такsource "${BASH_SOURCE%/*}/act.conf.sh"
Попробуйте следующее:
source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
источник
Обычно я добавляю это поверх своих скриптов.
cd $(dirname $BASH_SOURCE)
Затем весь последующий код выполняется относительно этого пути сценария.
источник