/bin/sh
kann bash
auf Ihrem System, aber wenn sie als aufgerufen sh
, bash
wird in POSIX - Modus ausgeführt werden (als ob POSIXLY_CORRECT
definiert wurde, oder es wurde begonnen mit --posix
).
In diesem Modus sind keine Prozessersetzungen vorhanden.
Lösungen:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternative:
all:
bash -c "diff <(command1) <(command2)"
Oder definieren Sie einfach den Makefile - Variable SHELL
wie /bin/bash
:
SHELL=/bin/bash
Wenn Sie Portabilität wünschen, wählen Sie die erste Lösung. Wenn Sie mit einer Abhängigkeit von bash
einverstanden sind, wählen Sie die zweite aus. Wenn Sie sich zusätzlich nicht um Nicht-GNU- make
Implementierungen kümmern müssen , verwenden Sie die dritte.
In Bezug auf die Einstellung SHELL
: Der POSIX-Standard besagt, dass ausführbare Dateien in Makefiles mit der system()
C-Bibliotheksfunktion von aufgerufen werden sollten make
. Es wird nicht garantiert, dass diese Funktion die SHELL
Umgebungsvariable verwendet (dies wird vom Standard sogar nicht empfohlen). Der Standard geht auch auf eine gewisse Länge ein, um zu sagen, dass das Festlegen der Makefile-Variablen SHELL
keine Auswirkungen auf die Umgebungsvariable haben sollte SHELL
. In den meisten make
mir bekannten Implementierungen wird jedoch die Makefile-Variable SHELL
verwendet, um die Befehle auszuführen.
Der Vorschlag in der Begründung für das make
Dienstprogramm lautet bash -c
:
Das historische MAKESHELL
Merkmal und verwandte Merkmale, die von anderen make
Implementierungen bereitgestellt wurden , wurden weggelassen. In einigen Implementierungen wird es verwendet, damit ein Benutzer die Shell überschreibt, die zum Ausführen von make
Befehlen verwendet werden soll. Das war verwirrend; Für ein tragbares make
Gerät sollte die Shell vom Makefile-Writer ausgewählt werden. Ferner kann ein Makefile-Writer nicht die Verwendung einer alternativen Shell erfordern und das Makefile dennoch als portabel betrachten. Während es möglich wäre, einen Mechanismus zum Angeben einer alternativen Shell zu standardisieren, stimmen vorhandene Implementierungen einem solchen Mechanismus nicht zu, und Makefile-Writer können bereits eine alternative Shell aufrufen, indem sie den Shell-Namen in der Regel für ein Ziel angeben. zum Beispiel:
python -c "foo"
bash
das Makefile oder eine andere Lösung für das Diff-Problem aufzurufen, ohne temporäre Dateien zu verwenden?SHELL
um/bin/bash
in der Datei Makefile.bash -c
.