我的愿望是不要更改目录然后执行。我使用一个 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
- 删除符号链接
- 执行:
PATH=$PATH:/opt/TreeForm/
然后export PATH
要使更改持久,请将第二点中的命令添加到您的 .bashrc 文件(在您的用户主目录中)。如果您希望它全局(对所有用户)将其添加到/etc/bash.bashrc