Получить `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)