Intereting Posts
Как запустить скрипт, когда SSSD создает домашний каталог для нового пользователя Почему бы не использовать «что»? Что использовать тогда? Массивы Bash – не работают Как фильтровать файлы pcap с помощью tshark Почему Root не удается получить доступ к каталогу FreeBSD? Как изменить идентификатор устройства PCI моей видеокарты в системе? (для установки драйвера Quadro на GeForce) Замена в VIM с неизменной регулярной выраженной частью ACPId suspend-to-ram: можете ли вы указать пробуждение с помощью событий клавиатуры? Извлечь первое слово после шаблона, которое включает “ Дисплей памяти с использованием md в u-boot Как модули ядра и ядра SCSI обрабатываются иначе, чем другие модули ядра? Обновить заголовок таблицы относительно имени файла MOTD не отображается после установки openssh из источника Шлюз последовательного порта NetBSD Bash: Каково использование типа (встроенные Bash)?

Получение истинного абсолютного пути сценария в / 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 для разрешения символических ссылок в путях.

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

 path_to_script () { if ! [ -L "$1" ]; then echo "$1" else path_to_script "$(readlink "$1")" fi }