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, time
ist das Schlüsselwort in bash
(es sei denn, Sie haben auch dietime
Programm, was ich nicht habe) und Makefile
verwendet es sh
als 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 /bin
eine 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 -Syu
Update 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 sh
eines symbolischen Links zu bash
bedeutet nicht, dass der Aufruf sh
dem 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 bash
als Shell in Ihrem auswählen sollten Makefile
, wenn Sie die Funktionen von benötigen bash
.
Fügen Sie dies als erste Zeile Ihrer Makefile
Auswahl bash
als Shell hinzu:
SHELL := /bin/bash
Dies sollte Ihr Problem lösen.
Mehr zur Auswahl der Shell finden Sie indie GNU Make-Dokumentation