Получение истинного абсолютного пути сценария в / 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 } 
  • Помощь при проверке выполнения предыдущей команды
  • Есть ли альтернатива использованию rbash для ограничения пользователя в моей системе?
  • два файла .csv сравниваются с помощью awk
  • Избегайте задержек с сетевых вызовов в сценариях входа в систему и выхода из системы
  • Невозможно конкатенировать пути к файлам, разрешено отклонение
  • как мне обрезать ведущие и конечные пробелы из каждой строки некоторого вывода?
  • Как добавить оператор if (относительно пунктуации в слове) к этому сценарию bash
  • Объединение двух частей вместе для создания единого сценария
  • Замена определенного номера в файлах unix
  • Как создать список, сгенерированный md5deep в алфавитном порядке относительных путей?
  • Отклоните SSH-соединения от стран, не включенных в список, используя hosts.allow / hosts.deny в CentOS
  • Linux и Unix - лучшая ОС в мире.