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)" == "マスター" ]; それから \
    ...
于 2013-03-31T13:10:36.670 に答える
5

シェル ラインでは、シェル スクリプトと同じようにシェル コマンドを記述します。そのため、2 番目の操作が機能します。

Make がシェルの外で git コマンドを評価するようにしたい場合は、次のように操作をシェル関数で囲むことができます。

$(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 に答える