9

问题是当我为我的项目编写 Makefile 时,当我需要检测当前分支名称时,在 make 规则中我这样做了:

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 中,我通常在许多规则中使用$() 。

谢谢 :)

4

2 回答 2

14

在配方内部,您必须避开美元符号才能让外壳解释它们。否则,Make 将$(git ...)其视为内置命令或变量并尝试对其进行评估(当然,不成功)。

check_branch:
    if [ " $$ (git rev-parse --abbrev-ref HEAD)" == "master" ]; 然后 \
    ...
于 2013-03-31T13:10:36.670 回答
5

在 shell 行中,您可以像在 shell 脚本中一样编写 shell 命令。这就是第二个操作有效的原因。

如果您希望 Make 在 shell 之外评估 git 命令,可以将操作包含在 shell 函数中,如下所示:

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

你应该很高兴,尽管我经常将这种事情实现为:

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

或类似的规定。

于 2013-03-31T12:55:18.143 回答