总是从cygpath获得路径启动/ cygdrive?

时间:2015-11-10 11:16:01

标签: cygwin cygpath

在Cygwin上,cygpath应用程序在Windows和Unix风格的路径之间进行转换。

请考虑以下示例:

$ cygpath -u "c:/"
/cygdrive/c

$ cygpath -u "c:/cygwin64/bin"
/usr/bin

有没有办法从第二个命令中获取/cygdrive/c/cygwin64/bin

我需要这个,因为有时Cygwin对它的根位置感到困惑,所以我想要一个绝对路径以便清楚。

2 个答案:

答案 0 :(得分:2)

不,Cygwin的cygpath不支持此功能。您可以做的最好的事情是使用您自己的转换工具手动修复它;类似的东西:

#!/usr/bin/env bash

if [[ "$1" == -z ]]; then
    # Invoked with -z, so skip normal cygpath processing and convert the path
    # here.
    #
    # The sed command replaces "c:" with "/cygdrive/c", and switches any
    # back slashes to forward slashes.
    shift
    printf "%s\n" "$*" | sed -r 's!(.):([\\\/].*)$!/cygdrive/\1\2!;s!\\!/!g'
else
    # Not invoked with -z, so just call cygpath with the arguments this script
    # was called with.
    exec cygpath "$@"
fi

如果您将上述脚本存储为mycygpath.sh,那么它的行为与cygpath完全相同,除非您为其提供-z参数,在这种情况下,它只会转换为n:/ } /cygdrive/n/

$ ./mycygpath.sh -u "c:/"
/cygdrive/c

$ ./mycygpath.sh -u "c:/cygwin64/bin"
/usr/bin

$ ./mycygpath.sh -z "c:/cygwin64/bin"
/cygdrive/c/cygwin64/bin

当然,有一个显而易见的问题是为什么“Cygwin对其所在的位置感到困惑”;这根本不应该发生,并暗示你的Cygwin设置有问题。但这不是你问的问题,你没有给出足够的细节来开始提出建议。

答案 1 :(得分:1)

另一个非常丑陋但有效的解决方案是在cygwin根路径和传递路径中使用不同的字母大小写。您可以在/etc/mtab文件或mount命令的输出中检查您的cygwin根目录。

例如,如果您的cygwin64根目录是C:/cygwin64,请将您的路径作为C:/Cygwin64/bin传递。

对于我的设置:

  • cygpath -u d:/programs/cygwin64/bin提供/usr/bin
  • cygpath -u d:/Programs/cygwin64/bin提供/cygdrive/d/Programs/cygwin64/bin

显然,cygwin(或cygpath)会对路径前缀进行区分大小写的比较,当您更改大小写时,它会失败,并且前缀不会更改,您将获得完整路径。

更新(2017年7月15日)

在之前的版本中,有一些关于编辑/etc/mtab的想法(这是不可能的,或者,如果可能的话,是完全错误的),或/etc/fstab(这是好的,但不适用于根文件系统) )。不要那样做。

Cygwin首先查看cygwin1.dll的路径,然后在注册表中(例如,其中一个考虑的注册表项为HKEY_LOCAL_MACHINE\SOFTWARE\Cygwin\setup)初始化它的root。 注册表项发生了一些奇怪的事情:每次加载cygwin dll时都会更新,并且当cygwin1.dll从不同参数的cygwin发行版的不同二进制文件加载时,它会以不同的情况更新。 例如,

  • 执行d:\programs\cygwin64\bin\ls.exe后,该值变为\??\d:\programs\cygwin64
  • d:\Programs\cygwin64\bin\ls.exe提供\??\d:\Programs\cygwin64
  • d:\programs\cygwin64\bin\cygcheck.exe - \??\d:\programs\cygwin64
  • d:\Programs\cygwin64\bin\cygcheck.exe - \??\d:\Programs\cygwin64

<强>但

  • d:\programs\cygwin64\bin\cygcheck.exe -s提供\??\D:\programs\cygwin64
  • d:\Programs\cygwin64\bin\cygcheck.exe -s提供\??\D:\programs\cygwin64

根安装点d:\Programs\cygwin64\bin\mount.exe的输出总是(无论是什么情况)D:/programs/cygwin64 on / type ntfs (binary)

当cygwin1.dll加载了不同的(区分大小写的)路径时,我期望有不同的挂载点,因此对于d:\Programs\cygwin64\bin\mount.exe,根将是d:/Programs/cygwin64,对于d:\programs\cygwin64\bin\mount.exe它将是d:/programs/cygwin64。不确定这种不一致有什么问题(如果有的话),还在调查。