Ich finde die Bash- Syntax oft sehr hilfreich, z. B. Prozessersetzung wie in diff <(sort file1) <(sort file2)
.
Ist es möglich, solche Bash-Befehle in einem Makefile zu verwenden? Ich denke an so etwas:
file-differences:
diff <(sort file1) <(sort file2) > $@
In meinem GNU Make 3.80 gibt dies einen Fehler aus, da das shell
anstelle von verwendet wird bash
, um die Befehle auszuführen.
/bin/sh: -c: line 0: syntax error near unexpected token
('`Antworten:
Aus der GNU Make-Dokumentation,
So legte
SHELL := /bin/bash
an der Spitze Ihrer Make - Datei, und Sie sollten gut zu gehen.Übrigens: Sie können dies auch für ein Ziel tun, zumindest für GNU Make. Jedes Ziel kann seine eigenen Variablenzuweisungen haben, wie folgt:
Das wird gedruckt:
Weitere Informationen finden Sie in der Dokumentation unter "Zielspezifische Variablenwerte". Diese Zeile kann überall im Makefile stehen, sie muss nicht unmittelbar vor dem Ziel stehen.
quelle
man
. Sprechen Sie über Timings. : Pinfo
eigentlich, aber ich denke, es hat Andy wirklich geholfen. Ich weiß, ich hatteSHELL=/bin/bash
als erste Zeile des Makefiles (oder direkt nach dem Kommentar).Sie können
bash
direkt anrufen , verwenden Sie die-c
Flagge:Natürlich können Sie möglicherweise nicht zur Variablen $ @ umleiten, aber als ich dies versuchte, wurde
-bash: $@: ambiguous redirect
eine Fehlermeldung angezeigt. Vielleicht möchten Sie dies prüfen, bevor Sie sich ebenfalls damit befassen (obwohl ich es bin) mit bash 3.2.something, also funktioniert deins vielleicht anders).quelle
Wenn Portabilität wichtig ist, möchten Sie möglicherweise nicht von einer bestimmten Shell in Ihrem Makefile abhängig sein. Nicht in allen Umgebungen ist Bash verfügbar.
quelle
Sie können bash direkt in Ihrem Makefile aufrufen, anstatt die Standard-Shell zu verwenden:
anstatt:
quelle
make
der Wert der Umgebungsvariablen SHELL ignoriert wird.Es gibt eine Möglichkeit, dies zu tun, ohne Ihre SHELL-Variable explizit so einzustellen, dass sie auf Bash zeigt. Dies kann nützlich sein, wenn Sie viele Makefiles haben, da SHELL nicht von nachfolgenden Makefiles geerbt oder aus der Umgebung übernommen wird. Sie müssen auch sicherstellen, dass jeder, der Ihren Code kompiliert, sein System auf diese Weise konfiguriert.
Wenn Sie
sudo dpkg-reconfigure dash
die Eingabeaufforderung ausführen und mit "Nein" antworten, verwendet Ihr System den Bindestrich nicht als Standard-Shell. Es wird dann auf Bash zeigen (zumindest in Ubuntu). Beachten Sie, dass die Verwendung von dash als System-Shell etwas effizienter ist.quelle
sh
wird bash im Kompatibilitätsmodus (set -o posix
) ausgeführt. Die vom OP zu verwendende Funktionalität Prozesssubstitution ist in diesem Modus nicht verfügbar.Eine Möglichkeit, die auch funktioniert, besteht darin, sie in die erste Zeile Ihres Ziels zu setzen:
quelle