Невозможно использовать ключевое слово `time` в действии правила Makefile

Невозможно использовать ключевое слово `time` в действии правила Makefile

У меня есть простой Makefile:

бегать :
	время эхо фу

Вот что выводится при его использовании:

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

Почему не работает? Насколько я понимаю, timeэто ключевое слово bash(если вы также не установилиtime программа, которого у меня нет), и Makefileиспользует shкак оболочку по умолчанию, но у меня есть симлинк на 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

edit: обратите внимание, что это также /binсвязано с simlinked на /usr/bin, поэтому проблема не в различии между /bin/sh и /usr/bin/sh. Также я использую Arch Linux с последним pacman -Syuобновлением на сегодня 28 июня 2019 года.

Также, вот результат шестнадцатеричного дампа 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 := /bin/bash

Это должно решить вашу проблему.

Подробнее о выборе оболочки можно узнать вдокументация GNU Make

Связанный контент