Получить имя каталога, в котором выполняется script

У меня есть script, который использует файлы в каталогах вокруг него. Он использует

dirname $0

команды. Он должен работать из любого каталога, где я запускаю этот script, но когда я запускаю символическую ссылку, указывающую на то, что script, я получаю путь к символической ссылке. Поэтому я получаю вывод dirname, а не путь к script.

Кто-нибудь знает способ получить путь, где выполняется script?

Ответ 1

Получить реальный путь к вашему script

if [ -L $0 ] ; then
    ME=$(readlink $0)
else
    ME=$0
fi
DIR=$(dirname $ME)

Ответ 2

если у вас установлен realpath:

$(dirname $(realpath $0))

Ответ 3

Если я не понял вас, проблема должна быть такой же, как в: Как вы нормализуете путь к файлу в Bash?

Опция, о которой не упоминается, относится к одному слоту python:

python2.6 -c "import os,sys; print os.path.realpath(sys.argv[1])" "$0"

Наконец, не забудьте использовать двойные кавычки вокруг "$ 0".

Ответ 4

Более простое решение:

dirname $(readlink -f $0)

Протестировано на Ubuntu 14.04: which java возвращает /usr/bin/java, что является символической ссылкой.

readlink -f `which java`

Возвращает /usr/lib/jvm/java-8-oracle/jre/bin/java

Наконец,

dirname $(readlink -f `which java`)

Возвращает /usr/lib/jvm/java-8-oracle/jre/bin, который является папкой, в которой находится "java".