無法在 Makefile 規則操作中使用「time」關鍵字

無法在 Makefile 規則操作中使用「time」關鍵字

我有一個簡單的 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

編輯:也要注意/binsimlinked 到/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 文檔

相關內容