2013-03-31 71 views
4

的事情是,当我为我的项目写一个Makefile,当我需要检测当前分支的名字,在我做这个规则来实现:

check_branch: 
    if [ "$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \ 
    echo "In master" 
    else \ 
    echo "Not in master"; \ 
    fi 

当我调用make check_branch时,“$(git rev-parse --abbrev-ref HEAD)”没有工作,它返回“”空字符串。 但是,当我改变$()``,它完美的工作。

check_branch: 
    if [ "`git rev-parse --abbrev-ref HEAD`" == "master" ]; then \ 
    echo "In master" 
    else \ 
    echo "Not in master"; \ 
    fi 

为什么$()不能正常工作,而是“做了什么?只适用于“git”命令。

请注意,在我的Makefile中,我通常在很多规则中使用$()

谢谢:)

+1

请参阅:[在一个Makefile中转义](http://stackoverflow.com/questions/2382764/escaping-in-makefile)。问题在于'''(美元符号)对'make'特别。如果你使用双美元,它应该工作。 –

+1

你还应该注意确保你在'git'层次结构的目录中。 –

+0

@artlessnoise:你说得对,非常感谢。 :) – hanhp

回答

6

里面的食谱你必须逃过美元符号才能让它们被壳解释。否则,将对待$(git ...)作为内置命令或变量,并尝试对其进行评估(当然,不成功)。

 
check_branch: 
    if [ "$$(git rev-parse --abbrev-ref HEAD)" == "master" ]; then \ 
    ... 
3

在shell行中,可以像在shell脚本中那样编写shell命令。这就是为什么第二次操作的原因。

如果你想制作的外壳之外评估git的命令,你可以在一个shell功能封闭操作,如:

$(shell git rev-parse --abbrev-ref HEAD) 

而且你应该是好去,虽然我经常实施这种东西为:

branch := $(shell git rev-parse --abbrev-ref HEAD) 
target:dep 
    mkdir -p build/$(branch) 

或沿着这些线。

相关问题