У меня есть сценарий Bash, который должен знать полный путь. Я пытаюсь найти широко совместимый способ сделать это, не заканчивая относительными или выглядящими в стиле фанк путями. Мне нужно только поддерживать Bash, а не sh, csh и т.д.
Что я нашел до сих пор:
-
Принятый ответ на Получение исходного каталога скрипта Bash из адресов, получающих путь к скрипту через
dirname $0
, что нормально, но это может вернуть относительный путь (как.
), Что является проблемой, если вы хотите изменить каталоги в скрипте и путь к нему все еще указывает на каталог скрипта. Тем не менее,dirname
будет частью головоломки. -
Принятый ответ на абсолютный путь Bash-скрипта с OS X (специфично для OS X, но ответ работает независимо) дает функцию, которая проверит, смотрится ли
$0
относительно, и если да, то будет предварительно ожидать$PWD
к нему. Но результат все еще может иметь относительные биты в нем (хотя в целом это абсолютное) - например, если сценарий являетсяt
в каталоге/usr/bin
, и вы находитесь в/usr
и вы набираетеbin/../bin/t
чтобы запустить его (да, это запутанно), вы/usr/bin/../bin
в качестве пути к каталогу скрипта. Который работает, но... -
Решение
readlink
на этой странице, которое выглядит так:# Absolute path to this script. /home/user/bin/foo.sh SCRIPT=$(readlink -f $0) # Absolute path this script is in. /home/user/bin SCRIPTPATH='dirname $SCRIPT'
Но
readlink
- это не POSIX, и, очевидно, решение опирается на GNUreadlink
где BSD по какой-то причине не работает (у меня нет доступа к BSD-подобной системе для проверки).
Итак, разные способы сделать это, но у всех есть свои предостережения.
Что было бы лучше? Где "лучше" означает:
- Дает мне абсолютный путь.
- Извлекает прикольные кусочки, даже когда вызывается в запутанном виде (см. Комментарий к № 2 выше). (Например, по крайней мере, умеренно канонизирует путь.)
- Полагается только на Bash-isms или вещи, которые почти наверняка присутствуют в самых популярных разновидностях * nix-систем (GNU/Linux, BSD и BSD-подобные системы, такие как OS X и т.д.).
- По возможности избегает вызова внешних программ (например, предпочитает встроенные функции Bash).
- (Обновлено, спасибо за заголовок, который) Не нужно разрешать символические ссылки (на самом деле, я бы предпочел, чтобы он оставил их в покое, но это не требование).