ちょっと引っかかったので……
次のような Makefile
において、$$(Command) と $(shell Command) の動作は異なっています。
LATEST_MD ?= $(shell (ls -t *.md 2>/dev/null | head -n 1))
LATEST_MD2 ?= $$(ls -t *.md 2>/dev/null | head -n 1)
testfile.md:
@touch testfile.md
echo:testfile.md
@rm -f testfile.md;\
echo LATEST_MD: $(LATEST_MD);\
echo LATEST_MD2: $(LATEST_MD2);\
手短に言うと
- \$(shell Command): Makefile の評価時にコマンドが実行され、その結果を変数に代入します
- \$\$ (Command): これはコマンドタスクの中で実行されコマンドがシェルへ渡される際に評価されます
よってこのコードでは、LATEST_MD
には最新のファイルが表示され、LATEST_MD2
は何も表示されないはずです。
結果
$ make && make echo
LATEST_MD: testfile.md # LATEST_MDの定義時には testfile.md は存在する
LATEST_MD2: # この部分が呼び出される時点では testfile.md は存在しない