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

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

  • извлечение tar зависит от имени файла?
  • Как назначить переменную из другой переменной в отдельном файле
  • Как использовать команду чтения с вопросом и переменной alltogether?
  • Не удается ssh, соединение немедленно завершается с состоянием выхода 254
  • Найдите строку (например, grep -q) только в одном разделе файла
  • Событие не найдено в вызове sed в сценарии csh
  • Использование локальной оболочки на удаленной машине
  • nmap не будет распознавать имя хоста в моей локальной сети
  • 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 - лучшая ОС в мире.