Ссылка на файл относительно выполнения скрипта - PullRequest
73 голосов
/ 12 июля 2011

В скрипте bash, который я пишу, я использую source для включения переменной, определенной в файле конфигурации.Сценарий, который должен быть выполнен, act.sh, а сценарий source d - act.conf.sh, поэтому в act.sh у меня есть:

source act.conf.sh

Однако это работает только при запуске act.shв каталоге, в котором он находится, поскольку act.conf.sh относится к файлу, помещенному в рабочий каталог.Есть ли решение заставить его ссылаться на файл относительно исполняемого скрипта, не вызывая cd?Спасибо.

Ответы [ 3 ]

87 голосов
/ 12 июля 2011

См .: BASH FAQ # 28: "Как определить местоположение моего скрипта? Я хочу прочитать некоторые файлы конфигурации из того же места."

Любое решение не будет работать 100% времени:

Важно понимать, что в общем случае эта проблема не имеет решения. Любой подход, о котором вы, возможно, слышали, и любой подход, который будет подробно описан ниже, имеет недостатки и будет работать только в определенных случаях. Прежде всего, постарайтесь полностью избежать этой проблемы, не завися от местоположения вашего скрипта!

Если вам нужно написать очень инструмент для многократного использования, тогда использование правильного пути в качестве параметра для вашего сценария будет самым надежным методом .

Предполагая, что ваш сценарий будет запускаться только из определенных оболочек, и только с небольшой необходимой гибкостью, вы, вероятно, можете ослабить эту паранойю. Все еще хорошо смотреть на ваши варианты. Существуют общие модели, которые люди используют, которые особенно проблематичны.

В частности, в FAQ рекомендуется избегать использования очень часто используемой $0 переменной:

Ничто с надписью $0 никогда не будет пуленепробиваемым, потому что $0 сам по себе ненадежен.

В качестве альтернативы вы можете использовать $BASH_SOURCE. Примерно так:

source "${BASH_SOURCE%/*}/act.conf.sh"

В этом решении также есть некоторые предостережения. Проверьте страницу часто задаваемых вопросов, чтобы увидеть компромиссы между различными решениями. Кажется, они рекомендуют cd в сочетании с $BASH_SOURCE в тех случаях, когда это будет работать для вас, поскольку вы получаете удобное условие ошибки, когда он не может правильно развернуться.

25 голосов
/ 02 апреля 2015

См. Это: Bash: как _бест_ включать другие скрипты?

Я предлагаю использовать:

source $(dirname $0)/act.conf.sh
4 голосов
/ 12 июля 2011

Попробуйте следующее:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...