Подтвердить что ты не робот

Обратившись к файлу относительно выполнения script

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

source act.conf.sh

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

В качестве альтернативы вы можете использовать $BASH_SOURCE вместо этого. Что-то вроде этого:

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

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

Ответ 3

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

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}