通过包含脚本本身的目录中的符号链接运行 shell 脚本

Era*_*din 2 shell shell-script symlink cwd

我的愿望不是更改目录然后执行。我使用了一个 jar 文件,需要执行它。所以我做了一个非常基本的shell脚本来做到这一点。

#!/bin/sh
java -jar TreeForm.jar
Run Code Online (Sandbox Code Playgroud)

然后,我将其另存为TreeForm,而不是TreeForm.sh。接下来,我创建了一个符号链接,如下所示:

ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm
Run Code Online (Sandbox Code Playgroud)

它已成功创建。但是,当我运行时,我从 JAVA 中获取以下错误。

错误:无法访问 jarfile TreeForm.jar

因此,shell 脚本似乎不运行自己的目录或不查看该目录,而是在当前目录中运行。我真的不想修改我的脚本文件,给出TreeForm.jar. 所以我想问一下,有没有办法在不改变当前路径或向PATH变量添加路径的情况下找到相对于脚本文件的文件?或者是否有任何具有脚本路径的变量,而不是当前的?

Gil*_*il' 7

除非你告诉它,否则 shell 不会改变到另一个目录。如果您希望您的脚本在不同的目录中执行命令,请cd从您的脚本中调用。

脚本的路径可以作为"$0". 如果脚本是符号链接,那就是符号链接的路径。如果您想获得符号链接的最终目标,请调用realpath(适用于大多数但不是所有现代 unice;它适用于 Linux(GNU 和 BusyBox)、FreeBSD 和 Solaris 11,但不适用于 OSX)。

cd "$(dirname "$(realpath "$0")")"
Run Code Online (Sandbox Code Playgroud)

realpath是 GNU coreutils 的一个相对较新的补充;如果您的版本太旧,您可以使用readlink -f哪个更旧。对于非 GNU 系统,如果realpath不存在,则readlink可能存在,但它通常只查看一级符号链接,大多数readlink实现都没有-f完整解析的选项。

  • @ErayErdin 哦,我忘了 GNU coreutils 中的 `realpath` 是最近的。您可以改用`readlink -f`。 (2认同)