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变量添加路径的情况下找到相对于脚本文件的文件?或者是否有任何具有脚本路径的变量,而不是当前的?
除非你告诉它,否则 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完整解析的选项。