在.sh文件中不会忽略路径中的空格

时间:2016-12-07 23:27:20

标签: bash shell git-bash

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

我在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以击败空白

"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中时,空白分隔符不起作用?或者这是一个完全不同的问题?

更新

$JAVA包含在引号中:"$JAVA"修复它。

2 个答案:

答案 0 :(得分:3)

问题是bash在执行$JAVA命令之前将exec替换为其值。这意味着

exec $JAVA ...

变为

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

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

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

exec "$JAVA"

答案 1 :(得分:1)

将$ JAVA包装在exec语句中,它将显示在空白区域

exec "$JAVA" ...