簡単な Makefile があります:
走る : 時間エコーfoo
これを使用した場合の出力は次のとおりです。
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
なぜ機能しないのでしょうか?私の理解では、time
キーワードがbash
(time
プログラム(私は使っていません)をデフォルトのシェルとして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
わけではありません。sh
bash
これは何アーチウィキ言う:
When Bash, mksh and zsh are invoked with the sh name,
they automatically become more POSIX compliant.
つまり、一部の機能は利用できなくなるため、の機能が必要な場合は、 のbash
シェルとして を選択する必要があります。Makefile
bash
シェルとして Makefile
選択する最初の行としてこれを追加します。bash
SHELL := /bin/bash
これで問題は解決するはずです。
シェルの選択の詳細については、GNU Make ドキュメント