Получить `dirname $ 0` скрипта KornShell, вызываемого по символической ссылке - PullRequest
3 голосов
/ 25 января 2012

У меня есть организация папок, которая выглядит следующим образом:

link.sh
dist/MyApp-3.0.0/script.sh
dist/MyApp-3.0.0/lib/*.jar

link.sh является символической ссылкой на скрипт KornShell (ksh) script.sh. В сценарии оболочки я хочу вызвать программу Java с помощью следующей команды:

java -cp lib/*

Когда я пытаюсь запустить приложение по символической ссылке, я получаю ClassNotFound, потому что относительный путь разрешен из каталога базы ссылок (это нормально).

Внутри сценария оболочки, как я могу получить полный путь к сценарию (<...>/dist/MyApp-3.0.0/)? Это позволит мне изменить мой вызов Java:

java -cp ${SCRIPT_DIR}/lib/*

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Редактировать: используя readlink

Вы можете использовать readlink, и он сводится к:

SCRIPT_DIR=$(dirname "$(readlink -f $0)")

Редактировать: без ссылки на чтение

if test -h $0; then
    symdir=$(dirname "$(ls -l $0 | sed -n 's/.*-> //p')")
    if [[ -z $symdir ]]; then
        symdir=.
    fi
    fullreldir=$(dirname $0)/$symdir
fi
script_dir=$(cd $fullreldir; /bin/pwd)

Я неправильно понял местоположение скрипта и предположил, что каталог вызываемого скрипта находится в структуре каталогов целевого приложения, где будет работать следующее:

SCRIPT_DIR=$(cd $(dirname $0); /bin/pwd)
0 голосов
/ 25 января 2012

Вы должны использовать функцию readlink (man readlink)

my2c

...