Получить `dirname $0` скрипта KornShell, вызываемого по символической ссылке

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

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 потому что относительный путь определяется из базы ссылок dir (это нормально).

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

java -cp ${SCRIPT_DIR}/lib/*

2 ответа

Решение

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

Вы можете использовать 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)

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

my2c

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