2013-03-31 73 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) 

或沿着這些線。

相關問題