Makefile ルール アクションで `time` キーワードを使用できません

Makefile ルール アクションで `time` キーワードを使用できません

簡単な Makefile があります:

走る :
	時間エコーfoo

これを使用した場合の出力は次のとおりです。

$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127

なぜ機能しないのでしょうか?私の理解では、timeキーワードがbashtime プログラム(私は使っていません)をデフォルトのシェルとしてMakefile使用していますshが、それを に simlink していますbash。その他の関連する出力は次のとおりです。

$ type -a time
time is a shell keyword
$ bash --version
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ ls -l "$(which sh)"
lrwxrwxrwx 1 root root 4 Apr 30 05:13 /usr/bin/sh -> bash
$ make --version
GNU Make 4.2.1
$ ls -l /bin
lrwxrwxrwx 1 root root 7 May 23 10:18 /bin -> usr/bin
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr 30 05:13 /bin/sh -> bash
$ /bin/sh -c 'time true'

real    0m0.000s
user    0m0.000s
sys     0m0.000s

編集:/binは に simlink されていることにも注意してください/usr/bin。したがって、この問題は /bin/sh と /usr/bin/sh の違いによるものではありません。また、私は Arch Linux を使用しており、最新のpacman -Syuアップデートは 2019 年 6 月 28 日現在です。

また、Makefile の 16 進ダンプの結果は次のとおりです。

$ xxd Makefile
00000000: 7275 6e20 3a0a 0974 696d 6520 6563 686f  run :..time echo
00000010: 2066 6f6f 0a                              foo.

答え1

shにシンボリックリンクを張ったからといって、を呼び出すことが を呼び出すことと同じになるというbashわけではありません。shbash

これは何アーチウィキ言う:

When Bash, mksh and zsh are invoked with the sh name, 
they automatically become more POSIX compliant.

つまり、一部の機能は利用できなくなるため、の機能が必要な場合は、 のbashシェルとして を選択する必要があります。Makefilebash

シェルとして Makefile選択する最初の行としてこれを追加します。bash

SHELL := /bin/bash

これで問題は解決するはずです。

シェルの選択の詳細については、GNU Make ドキュメント

関連情報