2013-08-23 141 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