it-swarm.com.de

Wie kann ich die Bash-Syntax in Makefile-Zielen verwenden?

Ich finde Bash Syntax oft sehr hilfreich, z. Prozessersetzung wie in diff <(sort file1) <(sort file2).

Können solche Bash-Befehle in einem Makefile verwendet werden? Ich denke an so etwas:

file-differences:
    diff <(sort file1) <(sort file2) > [email protected]

In my GNU Make 3.80 wird dies einen Fehler auslösen, da Shell anstelle von bash zum Ausführen der Befehle verwendet wird.

187
Frank

Aus der GNU Dokumentation erstellen,

5.3.1 Choosing the Shell
------------------------

The program used as the Shell is taken from the variable `Shell'.  If
this variable is not set in your makefile, the program `/bin/sh' is
used as the Shell.

Also setze Shell := /bin/bash am oberen Rand Ihres Makefiles, und Sie sollten bereit sein, 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:

all: a b

a:
    @echo "a is $$0"

b: Shell:=/bin/bash   # HERE: this is setting the Shell for b only
b:
    @echo "b is $$0"

Das wird drucken:

a is /bin/sh
b is /bin/bash

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.

341
derobert

Sie können bash direkt aufrufen, indem Sie -c Flagge:

bash -c "diff <(sort file1) <(sort file2) > [email protected]"

Natürlich können Sie möglicherweise nicht auf die Variable $ @ umleiten, aber als ich das versuchte, bekam ich -bash: [email protected]: ambiguous redirect als Fehlermeldung, also sollten Sie sich das ansehen, bevor Sie sich damit befassen (obwohl ich Bash 3.2 verwende, funktioniert deins vielleicht anders).

15
Chris Lutz

Sie können bash direkt in Ihrem Makefile aufrufen, anstatt die Standard-Shell zu verwenden:

bash -c "ls -al"

anstatt:

ls -al
4
paxdiablo

Wenn Portabilität wichtig ist, möchten Sie möglicherweise nicht auf eine bestimmte Shell in Ihrem Makefile angewiesen sein. Nicht in allen Umgebungen ist Bash verfügbar.

4
Menno Smits

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 entnommen wird. Sie müssen auch sicherstellen, dass jeder, der Ihren Code kompiliert, sein System auf diese Weise konfiguriert.

Wenn du läufst Sudo dpkg-reconfigure dash und beantworten Sie die Eingabeaufforderung mit "Nein", Ihr System verwendet Dash 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.

2
Bill G