Cygwin:使用包含 Windows 路径的路径变量(其中包含空格)

Posted

技术标签:

【中文标题】Cygwin:使用包含 Windows 路径的路径变量(其中包含空格)【英文标题】:Cygwin: using a path variable containing a windows path (with a space in it) 【发布时间】:2011-05-19 01:56:30 【问题描述】:

我想在我的 PATH 中添加一些目录。 不幸的是,这些目录位于包含空间的 Windows 路径中(如文档和设置)

我尝试过没有成功:

创建变量:

43598811@E250BZD20015026 ~
$ winhome="/cygdrive/c/Documents\ and\ Settings/43598811/"

43598811@E250BZD20015026 ~
$ cd $winhome
bash: cd: /cygdrive/c/Documents\: No such file or directory    

43598811@E250BZD20015026 ~
$ cd "$winhome"
bash: cd: /cygdrive/c/Documents\ and\ Settings/43598811/: No such file or directory

创建别名:

43598811@E250BZD20015026 ~
$ alias winhome="/cygdrive/c/Documents\ and\ Settings/43598811/"

43598811@E250BZD20015026 ~
$ winhome
bash: /cygdrive/c/Documents and Settings/43598811/: is a directory

43598811@E250BZD20015026 ~
$ cd winhome
bash: cd: winhome: No such file or directory

使用软链接: 它正在工作......但我不想使用它

有什么建议吗?

【问题讨论】:

【参考方案1】:

Linux 不喜欢空格,windows 也不在乎。年代久远的战争! 伙计们,我建议不要卷入这场战争或在这场战争中下注。 :P

解决方法很简单,只需在cygwin中创建一个符号链接并开始使用即可。

例如:我的构建失败了,因为我将 JAVA_HOME 导出如下

$ export JAVA_HOME="C:\Program Files\Java\jdk1.8.0_144"

这在 cygwin 中不起作用,因为路径中有空格。

为了克服这个问题,我在我的主目录下创建了一个指向 Program Files 的符号链接。

$ cd ~

$ ln -s /cygdrive/c/Program\ Files ProgramFiles

$ export JAVA_HOME="/home/adandekar/ProgramFiles/Java/jdk1.8.0_144"

这工作得天衣无缝。 希望这会有所帮助!

【讨论】:

【参考方案2】:

您可以使用cygpath 将 Windows 路径转换为 ​​Cygwin 兼容的 POSIX 路径。还可以输出一些特殊系统文件夹的位置(如Windows主目录、桌面、我的文档等...)

p="C:\Documents and Settings"
cd "$(cygpath -u "$p")"

以下是 Cygwin 文档的一些相关链接:

Pathnames Mapping path names Using native Win32 paths

【讨论】:

感谢您的提示。但是我仍然坚持使用丑陋的命令:cd "$(cygpath -u "$p")"。我想将它存储在一个 var 中并在其他脚本或 cmd 中使用它,而不必记住语法...... p2="$(cygpath -u "$p")" 然后cd "$p2" 似乎(不检查任何文档)Cygwin 能够在 Windows 路径和文件规范作为参数时自动转换它们,但如果您需要运行某些东西则不能。 stat "$UTIL",文件 "$UTIL",什么都可以,但不仅仅是 "$UTIL"。我知道这不是 OP 要求的,但这个答案是 run 某些东西并涵盖我描述的情况的唯一方法。 @CharlesRobertoCanato 通常 Cygwin 程序理解 POSIX 和 Win32 样式的路径(尽管不推荐使用 win 路径)。从 Cygwin shell 调用本机 Windows 程序时(如调用 notepad.exe),它们显然不理解 POSIX 路径,必须显式转换。我编辑了答案以指向一些相关文档。 另请注意,MSYS/MinGW 有自己的自动路径转换启发式,与 Cygwin 无关:mingw.org/wiki/Posix_path_conversion【参考方案3】:

要访问路径 /cygdrive/c/Program Files (x86),请使用 \ 字符。

$ cd /cygdrive/c/Program\ Files\ \(x86\)

美好的一天!

【讨论】:

【参考方案4】:

使用cygpath --mydocs

根据cygpath --help的其他特殊文件夹:

-A, --allusers        use `All Users' instead of current user for -D, -O, -P
-D, --desktop         output `Desktop' directory and exit
-H, --homeroot        output `Profiles' directory (home root) and exit
-O, --mydocs          output `My Documents' directory and exit
-P, --smprograms      output Start Menu `Programs' directory and exit
-S, --sysdir          output system directory and exit
-W, --windir          output `Windows' directory and exit

【讨论】:

【参考方案5】:

我是一个完整的 cwywin 菜鸟 - 但是创建一个回到你的 windows home 的符号链接肯定是一个简单的第一步?

即:

 wh="/cygdrive/c/Documents and Settings/Erich/My Documents"
 ln -s "$wh" wh

那么你可以:

 ls wh

您可以为您的桌面等做同样的事情...而不再担心 win/cyg 转换?

编辑现在我已经使用了cygpath - 我相信这是可以使用的工具 - 无论有没有符号链接,它都是一个处理 *nix/wind 路径不相交的简洁小包

【讨论】:

您甚至可以使用本机 NTFS 符号链接,如 answer about CYGWIN="winsymlinks:native" 中所述。默认情况下,Cygwin 模拟将目标路径存储在常规文件中的常规符号链接。但是,非 Cygwin 应用程序不符合 Cygwin 解决方法。 @Guillaume @ErichBSchulz 使用本机 NTFS 符号链接可以在本机 Windows 应用程序和 Cygwin 应用程序之间共享符号链接。干杯【参考方案6】:

现在可能很晚了,但我对这个问题使用了不同的解决方案 持续数年。在 cygwin.bat 中,我添加了一些要创建的语句 使用subst 命令的虚拟驱动器。使用此命令,您可以替换 真正长路径的驱动器号 (以及那些包含空格或特殊 Win 字符的)。以后可以参考 它们从您的 shell 和脚本中直接作为 /cygdrive/x//cygdrive/y/ 和 很快。这也有助于从 Windows 获取这些目录的快捷方式 shell之类的资源管理器等

在相关说明中,如果您愿意,您可以通过使用去掉 /cygdrive 前缀 mount 来自 Cygwin 的命令。见mount --help

【讨论】:

【参考方案7】:

如果将路径放在引号中,则不需要转义空格,但是当您调用cd 时,您需要将变量本身放在引号中以获得正确的行为。

所以你的变量应该像这样简单地声明,但在变量周围使用引号来调用:

~>  winhome="/cygdrive/c/Documents and Settings/43598811/"
~>  cd "$winhome"

这是因为变量在 shell 中被替换的方式。如果你在没有" " 的情况下使用cd winhome,那么一旦变量被替换,它最终看起来像这样:

cd /cygdrive/c/Documents and Settings/43598811/

这被解析为四个单独的参数:cd/cygdrive/c/DocumentsandSettings/43598811/,这对 shell 没有意义,因为目录 /cygdrive/c/Documents 不存在。

【讨论】:

你自己试过了吗??? $winhome="/cygdrive/c/Documents and Settings/43598811/" 不起作用(可以设置,但不能 cd 到它)。 糟糕!您没有在问题中提到尝试这样做,所以我认为您没有这样做。我已经确定了我的答案,这次真的尝试了。 ;D @Guillaume:不用担心。我知道你的感受。【参考方案8】:

这行得通:

$ winhome="/cygdrive/c/Documents and Settings/"
$ cd "$winhome"
$ pwd
/cygdrive/c/Documents and Settings

【讨论】:

非常感谢! “$winhome”,我绝对想不到! 但是有没有办法避免评估中的“”? 不,我不这么认为。但这应该不是问题吗? 也许这是另一个问题,但我怎样才能在脚本中使用这个变量?如果我做desk="$winhome"/Desktop,那么cd $desk 不工作... @Guillaume:使用 `cd "$desk"。应始终引用包含文件名的变量。【参考方案9】:

如果您正确定义了变量,那么使用变量的方法应该可以工作。你的包含反斜杠是没有正当理由的。

【讨论】:

是的 - 它们看起来像是试图逃避(即引用)空格 - 但不需要,因为在原始帖子中引用了整个路径 - 我认为如果初始路径被从双精度中取出引用反斜杠空格实际上会使其工作 引用整个目录或转义反斜杠 - 不能同时使用!

以上是关于Cygwin:使用包含 Windows 路径的路径变量(其中包含空格)的主要内容,如果未能解决你的问题,请参考以下文章

cygwin和windows路径冲突

转换 POSIX->WIN 路径,在 Cygwin Python 中,不调用 cygpath

安装 Msysgit 时出错 - Cygwin 似乎在您的系统路径中

cygwin下golang环境搭建

cygwin命令-cygwin显示当前路径的绝对路径

cygwin