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

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

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

  • Динамически присваивать массив значению переменной. Eval?
  • Почему 2 машины linux ведут себя по-другому с командой того же синтаксиса?
  • Как некоторые команды изменяют критерии автозаполнения с вкладками?
  • Создайте файл фиксированного размера с определенным содержимым
  • Удаленный запуск через SSH
  • adb pull не принимает переменную как источник, дает * 'не существует .. * ошибка
  • Примером общей структуры дритекторий является:

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

  • Печать столбцов данных, которые
  • Что такое ярлык bash для перехода к предыдущему каталогу?
  • Идентификатор процесса печати (PID) экземпляра Matlab
  • понимание значения по умолчанию IFS
  • bash: Я сломал ]
  • Как я могу установить псевдоним bash, который оценивает $ () при запуске?
  • 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 - лучшая ОС в мире.