【发布时间】:2015-03-25 15:02:44
【问题描述】:
我在工作中使用 Windows 上的 GNU makefile,并尝试边做边学。给我带来这么多麻烦的食谱是
$(SED) -n "/Format ID $(def_format_id)/,/End Format ID $(def_format_id)/ p" "$(def_format_altsec_header)" > "$(def_format_file)"
C:/GNU1_06/bin/sed: -e expression #1, char 7: unterminated address regex 失败。
为了尝试了解过去几个小时我一直在努力解决的问题,我将其更改为一个简单的命令,以使 sed 启动和停止,以便我可以查看使用 Process Explorer 调用的确切内容:
$(SED) -e s/blah//
ProcExp 显示 make 正在使用预期的命令行直接调用 sed。但是,如果您单引号引用该参数,则 make 调用的内容完全相同(在命令行中找不到引号)。
当您使用双引号时,事情变得非常奇怪。
调用C:/GNU1_06/bin/sh.exe -c "C:/GNU1_06/bin/sed -e \"s/blah//\""
到目前为止一切顺利,但随后 sh 调用 C:\GNU1_06\bin\sed.exe -e s/blah//
好像转义的引号从不存在。
这里到底发生了什么?为什么我的引号在 sed 运行之前就消失了?
更新:这似乎与 $(SED) 是完全指定的路径这一事实有关。单独使用 sed.exe 时不会观察到这种行为(ProcExp 证明它使用相同的 sed 副本作为完全指定的路径)。
这个问题在最小的makefile中重现
.PHONY: all
all:
C:/gnu1_06/bin/sed.exe -n "/Format ID 01010101/,/End Format ID 01010101/ p" "./FORMAT/BIGHILO/AC/99/sff_altsec_01_data.h"
【问题讨论】:
-
你能把运行make时得到的输出包括进来吗?此外,如果您使用的是 Cygwin,则 Process Explorer 可能不会向您显示 Cygwin 实用程序实际使用的参数。
-
sed 导致原始失败的确切错误(第一个代码)是:C:/GNU1_06/bin/sed: -e expression #1, char 7: unterminated address regex
-
能否也添加 make 输出,在其中显示它执行的命令?
-
因为它立即失败我无法在 ProcExp 中查看它。当我执行 -n 时,它会打印 C:/GNU1_06/bin/sed -n "/Format ID 01010101/,/End Format ID 01010101/ p" ""./FORMAT/BIGHILO/AC/99/sff_altsec_01_data.h" > "。 /build/BIGHILO/AC/99/Process/Format/default_format_data.c”。但是,更简单的测试用例使得实际执行的可能性很小。
-
Make 通常会在执行每个命令之前打印它,因此它应该在 sed 打印出的错误消息之前的行上打印 sed 命令。如果它不这样做,那么您要么在命令开头遗漏了
@,要么发生了一些非常奇怪的事情。也许您应该发布一个最小的完整可验证示例生成文件来演示该问题。包括示例的完整输出。还要确认您实际上使用的是 Cygwin 版本的 make、sed 和 sh。对于 Cygwin 安装,GNU1_06路径名很奇怪。
标签: shell makefile cygwin gnu-make