Ответ 1
Любое решение не будет работать в 100% случаев:
Важно понимать, что в общем случае эта проблема не имеет решения. Любой подход, о котором вы, возможно, слышали, и любой подход, который будет подробно описан ниже, имеет недостатки и будет работать только в конкретных случаях. Прежде всего, постарайтесь полностью избежать проблемы, не завися от расположения вашего script!
Если вам нужно написать инструмент многократного использования, то правильный путь в качестве параметра для вашего script будет самым надежным методом.
Предполагая, что ваш script будет запущен только из определенных оболочек, и только с небольшой гибкостью, возможно, вы можете расслабиться в этой паранойе. По-прежнему приятно смотреть на ваши варианты. Обычные шаблоны, которые люди используют, особенно проблематичны.
В частности, в FAQ часто рекомендуется избегать очень часто используемой переменной $0
:
Ничто, которое читает
$0
, никогда не будет пуленепробиваемым, потому что$0
само ненадежно.
В качестве альтернативы вы можете использовать $BASH_SOURCE
вместо этого. Что-то вроде этого:
source "${BASH_SOURCE%/*}/act.conf.sh"
Есть также некоторые предостережения для этого решения. Просмотрите страницу часто задаваемых вопросов, чтобы увидеть компромисс между различными решениями. Кажется, они рекомендуют cd
в сочетании с $BASH_SOURCE
в тех случаях, когда он будет работать для вас, так как вы получите удобное условие ошибки, когда он не сможет правильно раскрыть.