不能在 Makefile 规则操作中使用“time”关键字

不能在 Makefile 规则操作中使用“time”关键字

我有一个简单的 Makefile:

跑步 :
	时间回声 foo

这是我使用它时的输出:

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

为什么不起作用?据我了解,timeis 关键字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作为外壳。Makefilebash

Makefile将此行添加为您选择bash的 shell 的第一行:

SHELL := /bin/bash

这应该可以解决你的问题。

有关选择 shell 的更多信息,请参阅GNU Make 文档

相关内容