为什么 Java 会根据是否从脚本调用在 macOS 上使用绝对路径为“文件存在”返回不同的结果?

Kid*_*rla 5 java macos shell file

我正在开发一个将在 Windows 和 Mac 环境中执行的 Java 程序。我个人在 Windows 上。我让我的同事在 macOS 11.4 上测试 JAR 并且它可以工作,但是我们正在尝试使用一个脚本来避免键入java -jar lfm.jar. JAR 有各种各样的任务,这里最重要的是maplog,所以语法就是java -jar lfm.jar maplog [directoryname]. 所以这是我非常简单的脚本maplog.sh

#!/bin/sh

java -jar lfm.jar maplog "$@"
Run Code Online (Sandbox Code Playgroud)

所以你应该能够做到sh maplog.sh [directoryname],它的结果与java -jar lfm.jar maplog [directoryname]. (顺便说一句,我确实在 Windows 上使用 Bash 进行了测试,效果很好。)但我们发现,在 macOS 上,使用脚本传递时,即使使用绝对路径,文件也会报告为不存在。

这是我的 Java 11 代码的相关部分(为简洁起见,删除了各种不相关或错误处理的内容):

#!/bin/sh

java -jar lfm.jar maplog "$@"
Run Code Online (Sandbox Code Playgroud)

这是我的同事运行此代码时的输出(我只编辑了他们的用户名和主机名,我已经检查过它们是相同的,而不是问题的原因 - 另请注意,他们的用户名不包含任何空格):

macOS 输出

基本上,查询的路径是完全一样的,但是根据你是否通过脚本运行它会得到不同的结果。

最后,我的同事发现对脚本的修改有效

#!/bin/sh

echo $(java -jar lfm.jar maplog "$@")
Run Code Online (Sandbox Code Playgroud)

这现在可以正常工作并正确地发现文件存在。但是我仍然不知道为什么原始解决方案不起作用以及为什么这个修改后的解决方案有效。也许如果我更好地理解它,我可以找到更好的解决方案。