.sh 文件中没有忽略 Path 中的白色 Space

White Space in Path is not being ignored in .sh file

我搜索了多个问题/回复,但没有找到适合我的。

我正在 Windows 并且正在尝试 运行 通过 Git 申请 Bash:

$ ./bin/program.sh config/program.properties

我得到的错误是:

C:/bin/program.sh: line 127: C:\Program: No such file or directory

我已将问题范围缩小到 .sh 中较早的部分

if [ -z "$JAVA_HOME" ]; then
  JAVA="java"
else
  JAVA="$JAVA_HOME/bin/java"
fi

好吧,第 127 行有:

exec $JAVA ...

该行还有更多内容,但问题出在 JAVA_HOME 部分。我的 JAVA_HOME 是

C:\Program Files\Java\jre1.8.0_111\bin\java

我尝试了多种不同的方法来替换 JAVA 来击败白色 space

"C:\Program Files\Java\jre1.8.0_111\bin\java"
"C:\Program/ Files\Java\jre1.8.0_111\bin\java"
"C:/Program\ Files/Java/jre1.8.0_111/bin/java"
C:/"Program Files"/Java/jre1.8.0_111/bin/java
'C:/Program Files/Java/jre1.8.0_111/bin/java'

可能还有更多组合,但我忘记了。这是 Git Bash 的问题吗?或者这是我不知道的关于 .sh 文件的东西?或者当存储在 $JAVA 中时白色 space 分隔符不起作用?或者这是一个完全不同的问题?

更新

$JAVA 括在引号中:"$JAVA" 修复了它。

将$JAVA包裹在exec语句中,它会看过去的白色space

exec "$JAVA" ... 

问题是 bash 在执行 exec 命令之前用它的值替换了 $JAVA。这意味着

exec $JAVA ...

变成

exec C:\Program Files\Java\jre1.8.0_111\bin\java

exec 仅在发生此替换后才能看到参数。 Program Files 中的 space 使它看起来像是 exec 的两个独立参数。第一个是 C:\Program,第二个是 Files\Java\jre1.8.0_111\bin\java

要解决此问题,您需要将 Java 安装移动到路径中没有 space 的目录,或者您需要引用发送到 exec 的参数:

exec "$JAVA"