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

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

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

#!/bin/sh
java -jar TreeForm.jar

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

ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm

就创建成功了。但是,当我运行时,我从 JAVA 中收到以下错误。

错误: 无法访问 jarfile TreeForm.jar

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

答案1

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

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

cd "$(dirname "$(realpath "$0")")"

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

答案2

您可以从 shell 脚本的参数中派生出该 shell 脚本所在的目录$0。例如,您可以dirname在脚本中执行此操作:

cd $(dirname "$0")

假设您的 jar 文件与脚本位于同一目录中。

如果您想通过符号链接引用脚本(并且仍然假设脚本和 jar 文件位于同一目录中),您可以通过更复杂的脚本来完成此操作

  • 找到路径名$0(如果使用默认$PATH查找,则很简单),并且
  • readlink使用诸如读取符号链接之类的程序。这不是 POSIX,但存在于许多 Linux 系统上。
  • 如果您没有readlink,可以使用其他解决方法(包括读取 的输出ls)。
  • cd无论您如何阅读链接,地点。

进一步阅读:

答案3

  1. 删除符号链接
  2. 执行:PATH=$PATH:/opt/TreeForm/然后export PATH

要使更改持久,请将第二点中的命令添加到您的 .bashrc 文件(在您的用户主目录中)。如果您希望它全局(对所有用户)将其添加到/etc/bash.bashrc

相关内容