在Cygwin上,cygpath
应用程序在Windows和Unix风格的路径之间进行转换。
请考虑以下示例:
$ cygpath -u "c:/"
/cygdrive/c
$ cygpath -u "c:/cygwin64/bin"
/usr/bin
有没有办法从第二个命令中获取/cygdrive/c/cygwin64/bin
?
我需要这个,因为有时Cygwin对它的根位置感到困惑,所以我想要一个绝对路径以便清楚。
答案 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)会对路径前缀进行区分大小写的比较,当您更改大小写时,它会失败,并且前缀不会更改,您将获得完整路径。
在之前的版本中,有一些关于编辑/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
。不确定这种不一致有什么问题(如果有的话),还在调查。