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

У меня есть утилита, состоящая из нескольких каталогов с некоторыми сценариями 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 ?

  • Установка плагина gedit на Fedora
  • Как скопировать файл в сценарий bash и переименовать его во время копирования и поместить его в тот же каталог
  • Назначение IP-адреса переменной окружения
  • bash - использовать значение переменной int для ссылки на параметр позиции в функции
  • Создайте подкаталоги под родителем, но введите имя родителя
  • Как работать с float в скрипте Shell?
  • Нужен ли мне набор ulimit для системных служб, таких как nginx.service (systemd) / nginx (sysv)?
  • Что делает $ {3 #?}?
  • 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 - лучшая ОС в мире.