我有一个GNU 生成文件它在 Linux、Solaris 和 OS X 上运行良好。然而,在 Cygwin-32、Cygwin-64 和 MinGW 下,它会产生:
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `echo 2.0.4(0.287/5/3) | egrep -i -c "fc22.i686"'
没有第 0 行;而针对 Fedora 22 的测试实际上发生在第 73 行:
IS_FEDORA22_i686 = $(shell echo $(RELEASE) | $(EGREP) -i -c "fc22.i686")
Cygwin 和 MinGW 发生了什么?更重要的是,我该如何修复它?
我知道这听起来有点夸张,所以这里是屏幕截图。左上角是 MinGW。中间是 Cygwin-32。右下角是 Cygwin-64。
答案1
问题在于,shell 认为括号位于$RELEASE
任何引号之外,因此尝试解释它们。可以尝试以下两种方法:将引用括在双引号中$(RELEASE)
,并使用:=
per这。 例如:
SHELL:=/bin/bash. #at the top of the makefile
IS_FEDORA22_i686 := $(shell echo "$(RELEASE)" | $(EGREP) -i -c "fc22.i686")
编辑: 尤纳姆带有开关的输出-m
通常没有任何 shell 元字符。任何带有元字符的变量都可能出现同样的问题。这就是为什么SHELL
在 makefile 中设置很有用的原因 - 如果用户正在运行csh
,您将遇到与不同的问题bash
。