2013-03-31 2 views
4

Дело в том, когда я писал Makefile для моего проекта, когда мне нужно было определить текущее имя ветви, в правиле макияжем я сделал это:

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

Когда я позвонил, сделайте 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

Внутри рецептов вам нужно избегать знаков доллара, чтобы заставить их интерпретировать оболочку. В противном случае Make обрабатывает $(git ...) как встроенную команду или переменную и пытается ее оценить (конечно, безуспешно).

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

В строках оболочки, вы пишете команды оболочки, как вы бы в сценарии оболочки. Вот почему работает вторая операция.

Если вы хотите сделать, чтобы оценить команду GIT вне оболочки, вы можете заключить операцию в функции оболочки, как в:

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

И вы должны быть хорошо идти, хотя я часто реализации такого рода:

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

Или что-то в этом роде.

Смежные вопросы