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

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

dirname $0

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

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

4 ответа

Решение

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

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

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

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".

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

$(dirname $(realpath $0))

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

Опция, не упомянутая здесь, это следующая однострочная строка:

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

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

Другие вопросы по тегам