【问题标题】:export JAVA_HOME with spaces in Cygwin在 Cygwin 中导出带有空格的 JAVA_HOME
【发布时间】:2013-01-28 17:01:21
【问题描述】:

我正在尝试使用以下命令在 Cygwin 中设置我的 JAVA_HOME:

export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.7.0_10"

但是当我执行cd $JAVA_HOME 时,我会收到此错误:

$ cd $JAVA_HOME
-bash: cd: /cygdrive/c/Program: No such file or directory

我尝试引用并转义空格(即\),但没有成功。 知道还有什么吗?

谢谢,

【问题讨论】:

  • 需要引用cd命令:cd "JAVA_HOME"

标签: cygwin export space java-home


【解决方案1】:

我也遇到过这个问题,我看到很多帖子,但都没有真正奏效。我做了一个小技巧,事情开始奏效了。

我的 JAVA_HOME 设置为 C:/Program Files/Java/jdk1.7.0_23。 问题出在 Program Files 目录上,我遇到了同样的错误。

在 Windows 中,为每个有空格的目录创建一个短名称,没有空格。 您可以通过在命令提示符下运行 dir /X 命令来查看它。 Program Files 的简称为 PROGRA~1。

在通过我的电脑的 Windows 环境变量中,我将 JAVA_HOME 更改为 C:/PROGR~1/Java/jdk1.7.0_23,在 hadoop-env.sh 中我将 JAVA_HOME 更改为 /cygdrv/c/PROGRA~1/Java /jdk1.7.0_23.

效果很好。

【讨论】:

  • +1 - 请注意 - 您必须重新启动 cygwin 会话才能检测到修改后的环境变量。
  • 请注意“C:\Program Files (x86)”是“/cygdrive/c/PROGRA~2”
【解决方案2】:

您正确设置了JAVA_HOME。现在让我们也正确地cd

cd "$JAVA_HOME"

【讨论】:

  • ls "$JAVA_HOME" 怎么样?当它不工作时,新的错误信息是什么?
  • 顺便说一句,它是 64 位系统吗?涉及某种程序文件到程序文件(x86)的重定向,也许cygwin 32位的东西根本看不到你真正的程序文件。
  • 是的,有一个 Program Files (x86),但我在 Program Files 中也有一些东西(出于历史原因)。 ls 命令返回与 cd 命令相同的错误。
  • 您在cd 没有双引号时发布了您的命令和错误消息。现在用双引号为cd 发布相同的内容。还尝试逐个元素地检查它:ls "/cygrive/c/Program Files/" 是否显示 Java 子目录? ls "/cygrive/c/Program Files/Java/" 呢? (主要要了解的是,我们已经通过使用双引号解决了变量的问题。剩下的是文件系统的问题。
  • 当 cd 命令嵌入到脚本中时,此解决方案没有多大用处 - 例如启动 tomcat 的脚本。我不想编辑 tomcat 脚本来让它工作,一个更好的解决方案是使用 windows 短名称,尽管我觉得必须这样做更能突出 Cygwin 的一个缺点。
【解决方案3】:

为避免使用繁琐的 Windows 环境变量,并使用从 Windows 资源管理器复制的实际路径字符串,我建议在您的启动脚本中添加以下内容:

             TMP=`cygpath -sw "C:\Program Files\Java\jdk1.8.0_31"`
export JAVA_HOME=`cygpath -u $TMP`

第一个cygpath调用获得一个short,windows路径;第二个将其转换为 unix 格式,这在 cygwin 中可以正常工作。

这现在也可以正常工作了:

$ cd $JAVA_HOME

【讨论】:

  • 很好的解决方案!谢谢。我不得不在 Java 8 和 Java 11 之间切换,这在 Windows 上简直是一场噩梦。这篇文章拯救了我的一天!。
【解决方案4】:

尽量使用短名称以避免路径中出现空格。

"C:\Program Files" 应该有短名称 C:\Progra~1(您可以使用 DOS dir 命令或在文件资源管理器的地址栏中输入它来验证它)。

这样设置你的 JAVA_HOME:

export JAVA_HOME="/cygdrive/c/Progra~1/Java/jdk1.7.0_10"

【讨论】:

    【解决方案5】:

    尝试使用 DOS subst 命令获取 JAVA_HOME 路径名的空格。 假设驱动器 J;未安装或以其他方式使用。

    在 DOS shell 中

    subst j: "C:/Program Files/Java/jdk1.7.0_45"
    

    J: 现在是 C:/Program Files/Java/jdk1.7.0_45 的缩写

    你现在可以 cd 到 J:

    现在运行 Cygwin 和

    export JAVA_HOME="J:"
    

    【讨论】:

      【解决方案6】:

      我在“程序文件”之外安装了 Java,特别是在 c:\tools 中。然后你可以使用 cygpath 将 C:\tools\jdk1.8.0_144 转换为 /cygdrive/c/tools/jdk1.8.0_144

      【讨论】:

      • 如果你不能选择你的安装目录,用cygwin做一个软链接,链接的路径没有空格,设置JAVA_HOME为那个。
      【解决方案7】:

      MSYS2终端上

      检查之前的声明: ls "/C/program files/" !工作! - 那是长文件名,所以,重点:

      export JAVA_HOME="/D/Devel/jdk-12.0.2"
      

      现在 maven 可以工作了....

      检查:

      user55@DESKTOP MSYS ~
      # echo $JAVA_HOME
      /D/Devel/jdk-12.0.2
      

      【讨论】:

        猜你喜欢
        • 2021-03-05
        • 2012-11-12
        • 1970-01-01
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        相关资源
        最近更新 更多