我有一個簡單的 Makefile:
跑步 : 時間迴聲 foo
這是我使用它時的輸出:
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
為什麼不起作用?據我了解,time
是關鍵字bash
(除非您還安裝了time
程式,我沒有),並Makefile
用作sh
預設 shell,但我將其模擬連結到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
simlinked 到/usr/bin
,因此問題不是由於 /bin/sh 和 /usr/bin/sh 之間的差異造成的。我還使用 Arch Linux,最新pacman -Syu
更新截至 2019 年 6 月 28 日。
另外,這是 Makefile 的十六進位轉儲的結果:
$ 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 的第一行:
SHELL := /bin/bash
這應該可以解決你的問題。
有關選擇外殼的更多信息,請參見GNU Make 文檔