Получение истинного абсолютного пути сценария в / bin / sh

Я ищу способ получить реальный абсолютный путь к текущему сценарию /bin/sh . Он должен работать для таких ситуаций, как этот:

 /path/to/symlink/in/PATH/somescript -> ../../Package/current/bin/somescript.sh 

… где ../../Package/current сам по себе является символической v1.23 указывающей на v1.23 .

Важные предположения: мы предполагаем, что readlink доступен, но необязательно имеет параметр -f .

Поскольку код интереса содержится в файле сценария, этот код может с уверенностью предположить, что все символические ссылки являются законными и в конечном итоге указывают на нужное место (иначе код не был бы найден оболочкой и выполнен в первую очередь) , IOW, нет необходимости беспокоиться о циклах симлинк, сломанных символических ссылках и т. Д.

Ниже я приложу свою лучшую попытку, но это кажется мне чересчур излишним. Есть ли более простой способ?


Вот моя версия:

 path_to_script () { TARGET="$1" BASENAME="$(basename "$TARGET")" ( cd -P "$(dirname "$TARGET")" if [ -h "$BASENAME" ] then path_to_script "$(readlink "$BASENAME")" else echo "$PWD/$BASENAME" fi ) } PATH_TO_SCRIPT="$(path_to_script "$0")" 

В основном, он рекурсивно следует символическим ссылкам, используя cd -P для разрешения символических ссылок в путях.

One Solution collect form web for “Получение истинного абсолютного пути сценария в / bin / sh”

Я думаю, что это не только короче, но и легче читать; YMMV.

 path_to_script () { if ! [ -L "$1" ]; then echo "$1" else path_to_script "$(readlink "$1")" fi } 
  • Что означает различие с фигурными фигурными скобками?
  • Использование файла ASCII в mailx
  • Почему это «while kill -0 $ PID», а не «до kill -0 $ PID»?
  • как я могу найти файлы на основе разных имен и удалять их все в одной строке
  • почему csv потребляет больше размера файла в моем скрипте unix?
  • Существуют ли какие-либо стандарты / документы, которые рассказывают мне, как создавать такие полезные справочные сообщения?
  • График счета и совпадающие строки одновременно
  • Как создать сценарий оболочки для обработки команд типа ls -l / somedir
  • crontab не выполняет мой скрипт?
  • Параметры Bash - Split
  • Использование исходной команды bash возвращает ошибку, хотя она успешно прочитала конфигурационный файл
  • Linux и Unix - лучшая ОС в мире.