Cygwin 在变量中丢失了 Windows 样式路径的驱动器号冒号

Cygwin 在变量中丢失了 Windows 样式路径的驱动器号冒号

我在尝试使用构建脚本(来自第三方)在 Win7 和 Cygwin(最新版本)的设置上运行时遇到了一个奇怪的问题。该问题可能最好用示例bash脚本片段来描述:

foo="/cygdrive/c/svn/Projects/Client Config/Android/Repack/foo/out"
cygpath -w "$foo/play-services-tasks/classes.jar"
bar=`cygpath -w "$foo/play-services-tasks/classes.jar"`
echo $bar

运行结果如下(注意驱动器号后的冒号):

C:\svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar
C \svn\Projects\Client Config\Android\Repack\foo\out\play-services-tasks\classes.jar

因此,在将路径( 的输出cygpath)放入变量之前,该路径是正确的,但变量不再包含驱动器号后的冒号。这反过来又导致另一个脚本/工具在尝试迭代变量中空格分隔的路径时失败。不幸的是,该工具需要具有 Windows 样式的路径。

不用说,我感到很困惑……

这个问题出现在构建脚本更改时,它可能缺少一些 cygwin 兼容性技巧,其中一些我已经设法应用了,但这个真的很糟糕。也许可以以某种方式解决更改的部分,但我更愿意弄清楚我发现的原因是什么以及如何直接处理它。

答案1

当构建脚本发生更改并且缺少一些 cygwin 兼容性技巧时,就会出现此问题,在遇到此问题之前,我已经设法应用了其中一些技巧。

我终于设法找出了真正的罪魁祸首,那就是构建脚本中有一个函数(在迭代变量时PATH)设置了环境变量IFS=:,但之后没有重置它。Asbash使用该变量将字符串拆分为字段,并且确实变量扩展SAVEIFS="$IFS"使用未加引号的变量时也是如此。因此,解决方法是在重新设置之前执行IFS,然后通过 将其重新设置IFS=$SAVEIFS。或者,正如 Gordon Davisson 善意解释的那样,我可以确保变量始终使用双引号(例如,echo "$bar"而不是echo $bar)。

问题解决了,与 Cygwin 没有任何关系,只是 Windows 和 Cygwin 中冒号的用途不同,因此有时需要接触内部字段分隔符变量。出于这个原因,我认为我应该把这个留在这里,以防其他人遇到类似的问题。还有关于 shell 扩展的各个方面有很多好东西关于使用。

相关内容