У меня есть простой 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