【问题标题】:Why Are My Quotes Disappearing? (GNU make/sh)为什么我的报价消失了? (GNU 制作/sh)
【发布时间】: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


【解决方案1】:

make 决定重建一个目标时,它会扩展配方,然后将结果中的每一行分别传递给 shell 的新调用。

除了,作为优化,当行不包含元字符(即,将由 shell 专门解释的字符,例如 @ 987654321@、>"& 等)。在这种情况下,make 只是直接执行该行。 AFAICT 此列表未记录在案。

就个人而言,在 Windows 上,我只使用 cygwin make。为什么?因为它在所有这些极端情况下都更加兼容。我曾经使用 mingw make 到过一个地方,那里 5 个反斜杠还不够,而 6 个又太多了。啊!

还要注意,Windows 中的命令行解析是疯狂的。 cmd.exe 内置的 echo 何时删除双引号?相信我,cygwin 'just works'™(平行建筑本身就值回票价)。

【讨论】:

  • 是的,Cygwin 不仅仅是在工作。也就是说,我们的发行版已经过时了,我们的开发人员经常与 IT 发生冲突,并且“如果它没有坏就不要乱搞!”在它上面(尤其是 Perl)。
  • 同情。我目前卡在 svn 1.6 上(我可以偷偷使用 1.6.17)。我真的很怀念过去 3.5 年的 svn 开发。我认为 IT 的全部意义在于使工具保持最新。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 2012-06-19
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多