2012-07-19 37 views
0

我有一個Makefle具有以下規則

bash -c "find . |grep -E '\.c$|\.h$|\.cpp$|\.hpp$|Makefile' | xargs cat | wc -l" 

我期待使運行引用bash腳本,並返回行的數量我項目。

在終端中直接運行該命令會執行該操作,但它在makefile中不起作用。 如果我從腳本刪除$,它的工作...但並不如預期(因爲我只想*.{c,cpp,h,hpp,Makefile}

爲什麼bash -c如果你寫這樣的規則不能正常運行我的腳本?

+0

你是什麼意思完全不起作用 – ant 2012-07-19 11:57:30

+1

可能重複[以下GNU make shell變量擴展有什麼問題?](http://stackoverflow.com/questions/7036352/whats-wrong-with-the -follow-gnu-make-shell-variable-expansion) – Gilles 2012-07-19 11:58:12

+0

它不起作用,因爲它返回0作爲結果。 0,因爲它沒有查看* .c文件,但可能是* .c $,但是對於grep,「$」應該表示行尾 – freemanuu 2012-07-19 12:11:27

回答

1

下文中,應該產生的結果,你想:

target: 
    @echo $(shell find . | grep -E '\.c$$|\.h$$|\.cpp$$|\.hpp$$|Makefile' | xargs cat | wc -l) 
0

在Makefile中,$用於製造變量,如$(頭),其中HEADERS本來以前使用=定義

。 210

要使用$ in內聯bash,您必須將它們加倍以避免它們。 $$ VAR將引用一個shell變量,而.c $$等應該爲您正在使用的正則表達式轉義$。

下逃脫應該足夠了$的什麼,你要完成

bash -c "find . |grep -E '\.c$$|\.h$$|\.cpp$$|\.hpp$$|Makefile' | xargs cat | wc -l" 

另外,你可以在你的Makefile全球範圍內使用bash,而不是如果缺省的/ bin/sh的添加此聲明:

SHELL = /bin/bash 

通過以上,您應該能夠使用find命令而不需要bash -c和引號。如果SHELL定義如上下面應該工作:

find . |grep -E '\.c$$|\.h$$|\.cpp$$|\.hpp$$|Makefile' | xargs cat | wc -l 

此外,請注意就可以了,經常會看到用於此目的的子shell。這些是用()創建的。這將使內部shell對該shell及其命令組定義的任何變量。