我在尝试使用构建脚本(来自第三方)在 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 扩展的各个方面有很多好东西关于使用。