我有一个简单的 Makefile:
跑步 : 时间回声 foo
这是我使用它时的输出:
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
为什么不起作用?据我了解,time
is 关键字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
这应该可以解决你的问题。
有关选择 shell 的更多信息,请参阅GNU Make 文档