makeでログファイルや実行結果を保存する場合、タイムスタンプを付けたファイルやディレクトリを使いたいことがあります。
単純にdateコマンドで作成したタイムスタンプをTSという変数に入れてみます。
$ cat Makefile TS=`date +%Y%m%d%H%M%S` all: echo ${TS} sleep 2 echo ${TS} $
この方法だとdateコマンドの結果ではなくコマンドシーケンス全体がTSに格納されるため1秒以上かかる処理があるとタイムスタンプがずれてしまいます。
$ make echo `date +%Y%m%d%H%M%S` 20100205005347 sleep 2 echo `date +%Y%m%d%H%M%S` 20100205005349 $
こういう場合、$(shell コマンド)という形式を利用するとコマンドの実行結果が文字列として格納できます。
$ cat Makefile TS=$(shell date +%Y%m%d%H%M%S) all: echo ${TS} sleep 2 echo ${TS} $ make echo 20100205005924 20100205005924 sleep 2 echo 20100205005924 20100205005924 $
他にも応用範囲が広いです。