2013-08-23 138 views
2

我试图从文本文件中获取我的编译版本。我使用这个命令Makefile中的Multiple Shell命令

grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//' 

它正常工作,但现在我想从我的Makefile中使用shell执行它:

VERSION=$(shell grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//') 

,但我不能让它发挥作用是因为|。如果我只放一个命令,例如grep运行正常,还有另一种方法可以指示连接表达式的|?或者我该怎么做呢?

编辑:

嗨,感谢您的回答,

读你的答案我意识到,复制/粘贴已经背叛了我杰杰奥,这是正确的表达我正在使用:

VERSION:= $(壳的grep -w -m 1 “V2” server.h | sed的 'S /#限定V2 [\吨] //')

这是生成文件的输出:

  • 未终止调用函数shell':missing')。停止。

我测试了你的建议,并且它也失败了,并且出现了同样的错误。

谢谢。

+0

哈希(''#)的化妆表示注释的开始。 #define和后面的所有内容都被视为评论,因此是未终结的表达。我会更新下面的答案。 – Craig

回答

5

它与管道无关。它不工作的原因是因为您已将其定义为动态宏。通过使用'='它将重新评估每个参考的宏。你本质上是通过试图将VERSION变量超载为版本和文件名来创建递归宏。尝试使用不同的变量名称并将其设为静态:

VERSION_NUMBER:=$(shell grep -w -m 1 "V1" server.h | sed $(VERSION) 's/#define V1[\t]//') 

$(error VERSION_NUMBER=$(VERSION_NUMBER)) 

删除$(错误),一旦你有它的工作。此外,AWK可能是在这种情况下更有效呢:

VERSION_NUMBER:=$(shell awk '/\<V1\>/ { print gensub(/^\#define V1[[:space:]]+/, "", ""); exit }' $(VERSION)) 

你也有散的问题(磅你美国小伙子们)#。它是作为评论终止表​​达。试试这个:

VERSION:=$(shell grep -w -m 1 "V2" server.h | sed 's/\#define V2[\t]//') 

或者这样:

VERSION:=$(shell awk '/\<V1\>/ { print gensub(/^\#define V1[[:space:]]+/, "", ""); exit }' server.h) 

你都会有这样的问题,在做出许多字符。美元是最难逃脱的问题。我所看到的表情是这样的:

V:=$(foreach f,$(list),$(eval $(shell create_rule $$$$(f)))) 

有时,最好是写一个shell脚本,并调用:

脚本。SH:

#!/bin/sh 

awk '/\<V1\>/ { print gensub(/^#define V1[[:space:]]+/, "", ""); exit }' "[email protected]" 

的Makefile:

VERSION=$(shell script.sh server.h) 
+0

是的,这就是问题,加\ \它的工作正常。谢谢 – user2710449