0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Make における $$(Command) と $(shell Command) の動作の違い

Posted at

ちょっと引っかかったので……

次のような 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 は存在しない
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?