【问题标题】:Get `dirname $0` of a KornShell script called by a symbolic link获取由符号链接调用的 KornShell 脚本的 `dirname $0`
【发布时间】:2012-01-25 11:50:42
【问题描述】:

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

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

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

java -cp lib/*

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

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

java -cp ${SCRIPT_DIR}/lib/*

【问题讨论】:

  • 您不能以 100% 的可靠性从 shell 代码中获取“运行脚本的完整路径”。不过,你可以靠近。

标签: shell unix ksh symlink


【解决方案1】:

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

【讨论】:

  • 不起作用:它返回链接目录,而不是脚本目录:/
  • 呵呵...您需要确保您使用的是/bin/pwd(命令),而不仅仅是pwd(shell 内置)- /bin/pwd 应该返回解析的路径
  • 我用两种机制显着改变了答案——一种使用readlink,另一种使用lssed,它更适合像Solaris这样的系统,它不默认附带 readlink
  • 没有 readlink 的编辑工作正常,非常感谢。我希望使用“dirname like”命令可以更轻松。关于 readlink,如何在我的 ksh 中引入它?这个人返回了一些东西,但是如果我在 script.sh 中执行你的命令行,我会得到 not found 错误。
  • readlink 是作为 gnu coreutils 的一部分提供的命令 - 您可以要求 shell 使用 type -p readlink 查找命令,如果它返回 readlink not found,则表示该命令不存在您的路径或未安装在您的系统上。您还应该能够使用locate readlink 命令来确定系统上 readlink 命令的安装位置
【解决方案2】:

你必须使用readlink函数(man readlink)

my2c

【讨论】:

  • 我试图完全在 ksh 中获得一些东西,没有依赖关系。如果不可能,我将在文件夹上创建一个链接,而不是将其放在脚本本身上:MyApp -> MyApp-3.0.0。不过谢谢
猜你喜欢
  • 2012-09-16
  • 1970-01-01
  • 2012-09-17
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2011-12-30
  • 2012-05-30
相关资源
最近更新 更多