Schlüsselwort „time“ kann in Makefile-Regelaktion nicht verwendet werden

Schlüsselwort „time“ kann in Makefile-Regelaktion nicht verwendet werden

Ich habe ein einfaches Makefile:

laufen :
	Zeit Echo foo

Hier ist die Ausgabe, wenn ich es verwende:

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

Warum funktioniert es nicht? So wie ich es verstehe, timeist das Schlüsselwort in bash(es sei denn, Sie haben auch dietime Programm, was ich nicht habe) und Makefileverwendet es shals Standard-Shell, aber ich habe es mit simlinked bash. Hier ist eine andere relevante Ausgabe:

$ 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

Bearbeiten: Beachten Sie auch, dass /bineine Simlink-Verbindung besteht /usr/bin, das Problem liegt also nicht an einer Unterscheidung zwischen /bin/sh und /usr/bin/sh. Außerdem verwende ich Arch Linux mit dem neuesten pacman -SyuUpdate vom heutigen 28. Juni 2019.

Hier ist außerdem das Ergebnis eines Hexdumps des Makefile:

$ xxd Makefile
00000000: 7275 6e20 3a0a 0974 696d 6520 6563 686f  run :..time echo
00000010: 2066 6f6f 0a                              foo.

Antwort1

Die Verwendung sheines symbolischen Links zu bashbedeutet nicht, dass der Aufruf shdem Aufruf von entspricht bash.

Das ist wasArchwikisagt:

When Bash, mksh and zsh are invoked with the sh name, 
they automatically become more POSIX compliant.

Das bedeutet, dass einige Funktionen nicht verfügbar sein werden und Sie dennoch bashals Shell in Ihrem auswählen sollten Makefile, wenn Sie die Funktionen von benötigen bash.

Fügen Sie dies als erste Zeile Ihrer MakefileAuswahl bashals Shell hinzu:

SHELL := /bin/bash

Dies sollte Ihr Problem lösen.

Mehr zur Auswahl der Shell finden Sie indie GNU Make-Dokumentation

verwandte Informationen