shell - 获取由符号链接(symbolic link)调用的 KornShell 脚本的 `dirname $0`

标签 shell unix ksh symlink

我有一个如下所示的文件夹组织:

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

link.sh是指向 KornShell (ksh) 脚本的符号链接(symbolic link) script.sh .在 shell 脚本中,我想使用以下命令调用 Java 程序:

java -cp lib/*

当我尝试从符号链接(symbolic link)启动应用程序时,我得到 ClassNotFound因为相对路径是从链接基目录解析的(这是正常的)。

在 shell 脚本中,如何获取脚本的完整路径 ( <...>/dist/MyApp-3.0.0/ )?它将允许我修改我的 Java 调用:

java -cp ${SCRIPT_DIR}/lib/*

最佳答案

编辑:使用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)

关于shell - 获取由符号链接(symbolic link)调用的 KornShell 脚本的 `dirname $0`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9002220/

相关文章:

c - 在 C 程序中使用 system ("clear") 命令时出现奇怪的输出

c - C 中的 UNIX 共享内存和信号量

shell - 如何使用 ksh 提取可变长度子字符串

java - 最终的 Processbuilder 命令是什么样的?

bash - 如何通过调用它的 shell 脚本找到进程名称?

python - 将答案传递给 popen.subprocess

linux - 如何搜索包含某种模式的文件,然后在所有这些文件中搜索另一种模式?

unix - 分割行号的文件基础

python - 在 Python Shell 中将文本格式化为框

android - 通过 bash 脚本获取 Android Studio 项目的构建文件夹路径