У меня есть утилита, состоящая из пары каталогов с некоторыми bash-скриптами и вспомогательными файлами, которые будут развернуты на нескольких машинах, возможно, в разных каталогах на каждой машине. Сценарии должны иметь возможность ссылаться на пути относительно себя, поэтому я должен иметь возможность получить путь к файлу, который выполняется в данный момент.
Я знаю об dirname $0
идиоме, которая прекрасно работает, когда мой скрипт вызывается напрямую. К сожалению, есть желание иметь возможность создавать символические ссылки на эти сценарии из совершенно другого каталога и при этом работать с относительной логикой пути.
Пример общей структуры каталогов:
/
|-usr/local/lib
| |-foo
| | |-bin
| | | |-script.sh
| | |-res
| | | |-resource_file.txt
|-home/mike/bin
| |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)
Как я могу надежно ссылаться /usr/local/lib/foo/res/resource_file.txt
из script.sh
того , что вызывается /usr/local/lib/foo/bin/script.sh
или ~mike/bin/link_to_script
?
источник
source
d (например$ source ./sript.sh
). Это работает в обоих случаях:DIR="$(cd "$(dirname "$BASH_SOURCE")" && pwd)"
одна линия:
источник
readlink -f
не работает для меня, у меня есть эта ошибка:Но это прекрасно работает:
источник
Одно небольшое дополнение к приведенному выше сценарию. Опция -P для pwd следует за символическими ссылками
источник