Получить путь к текущему скрипту при выполнении через символическую ссылку

У меня есть утилита, состоящая из нескольких каталогов с некоторыми сценариями bash и поддерживающих файлов, которые будут развернуты на нескольких машинах, возможно, в другом каталоге на каждой машине. Сценарии должны иметь возможность ссылаться на пути относительно себя, поэтому мне нужно иметь возможность получить путь к файлу, который в настоящее время выполняется.

Я знаю о dirname $0 idiom, который отлично работает, когда мой скрипт вызывается напрямую. К сожалению, есть желание создать символические ссылки для этих скриптов из совершенно другого каталога и по-прежнему иметь относительную логику пути.

Примером общей структуры дритекторий является:

 / |-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 ?

  • Вывод команды «history» после повторного подключения через SSH
  • $ PATH на Fish Shell OS X
  • " Предполагая, что кэш диска: напишите через« Необходимо скрыть это сообщение!
  • Bash перезаписывает первую строку при использовании пользовательской подсказки PS1
  • Оболочка сценария скрипта условно
  • Что делает «set -» в этой точке входа в Dockerfile?
  • Fish-Shell не сохранит мои псевдонимы
  • Сколько пользователей поддерживает поддержку Linux в одно и то же время через SSH?
  • 3 Solutions collect form web for “Получить путь к текущему скрипту при выполнении через символическую ссылку”

    Попробуйте это как решение общего назначения:

     DIR="$(cd "$(dirname "$0")" && pwd)" 

    В конкретном случае следующих символических ссылок вы также можете сделать это:

     DIR="$(dirname "$(readlink -f "$0")")" 

    одна линия:

     cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0)) 

    Одно небольшое дополнение к вышеупомянутому сценарию. Опция -P для pwd соответствует символическим ссылкам

     DIR="$(cd "$(dirname "$0")" && pwd -P)" 
    Linux и Unix - лучшая ОС в мире.