双击 Unix 可执行文件与来自终端的 运行 不同

Double clicking Unix Executable file is different from running it from terminal

我正在尝试创建 .app 包,其中包含 jdk、jar 和 shell 脚本,基本上我正在尝试 运行 jar 在 .app.

我在 .app 中的内容如下所示(应用程序与 unix 可执行文件同名):

.
├── MacOS
│   └── AppName
├── app
│   └── myapp.jar
└── jdk

AppName,如果我们给它 .sh 扩展名并查看它,看起来像这样

#!/bin/zsh

../jdk/bin/java -jar ../app/myapp.jar

如果我 运行 来自终端的此文件可执行文件 ./AppName 它可以正常工作。但是如果我只是双击它,它就不会工作说 no such file or directory: ../jdk/bin/java.

我认为它应该通过双击才能与 .app 一起使用,因为其他 .app-s 也是这样工作的。

../jdk/bin/java 这样的相对路径名是相对于当前工作目录的,而不是脚本的位置。

当您的工作目录不是 MacOS 而是父目录,并且您以 MacOS/AppName.

启动应用程序时,您可以在终端中重现该问题

一个可能的解决方案可能是

#!/bin/zsh

SCRIPTDIR=$(dirname [=10=])

"$SCRIPTDIR"/../jdk/bin/java -jar "$SCRIPTDIR"/../app/myapp.jar