2009-08-24 21 views
20

Ich lese das Dokument von GNU Make. Hier ist ein BeispielVier Dollarzeichen in Makefile

% .d:% .c

@set -e; rm -f [email protected]; \ 

    $(CC) -M $(CPPFLAGS) $< > [email protected]$$$$; \ 

    sed ’s,\($*\)\.o[ :]*,\1.o [email protected] : ,g’ < [email protected]$$$$ > [email protected]; \ 

    rm -f [email protected]$$$$ 

Ich habe versucht, dies auf einem C++ Programm, und bekam die Liste der Dateien

init3d.d init3d .d.18449 input.d input.d.18444 main.d main.d.18439

Hier ist, was ich gefunden habe, aber nicht Sie nderstand in den gleichen document

Wenn Sie sekundäre Erweiterung aktiviert und Sie möchten ein wörtliches Dollar-Zeichen in der Liste Voraussetzungen, müssen Sie tatsächlich vier Dollar-Zeichen schreiben (‚$$$$‘).

Ich frage mich, was die vier Dollarzeichen "$$$$" eigentlich bedeuten? Wie machen sie 18449, 18444 oder 18439?

Danke und Gruß!

Antwort

21

Wenn "sekundäre Erweiterung" aktiviert ist, wird $$$$ benötigt, um eine einzelne $ im tatsächlichen Ausgang zu generieren. $ wird normalerweise verwendet, um Variablen zu erweitern, Make-Funktionen aufzurufen, etc. $$ mit sekundärer Erweiterung aktiviert tut etwas anderes, aber sonst erzeugt es eine tatsächliche $ in der Ausgabe.

Die Shell, die zur Ausführung von Befehlszeilen auf Unix-ähnlichen Systemen verwendet, interpretiert normalerweise $$ als Erweiterung für Shell-Prozess-ID. Ohne aktivierte sekundäre Erweiterung wird $$$$ in der Ausgabe in $$ umgewandelt, wodurch die Shell zur Prozess-ID erweitert wird.

(den Shell-Prozess-ID verwenden als Suffix eine einfache Art und Weise zu versuchen, ist für eine temporäre Datei Einzigartigkeit von Dateinamen zu gewährleisten.)

+0

Secondary Expansion nicht die Rezeptur Inhalt beeinflussen. Nur die Liste der Voraussetzungen. '$$$$ 'erzeugt also immer' $$ 'im Rezeptkontext. Sie brauchen nur '$$$$' in der Liste der Voraussetzungen, um ein einzelnes '$' zu erhalten, wenn die sekundäre Erweiterung aktiviert ist (wenn Sie nicht '$$' verwenden, erhalten Sie das). –

+0

Dies ist nicht die Antwort. Die sekundäre Erweiterung ist irrelevant. – reinierpost

+0

@reinierpost es scheint, du hast die gleichen Verständnis Schwierigkeiten wie Etan Reisner :) Das ursprüngliche Plakat sprach über sekundäre Erweiterung, deshalb habe ich darüber geschrieben. Die eigentliche Erklärung befindet sich im zweiten Absatz, und der wahrscheinlichste Grund für die Verwendung dieses Konstrukts ist der dritte Absatz in Klammern. –

2

18449, 18444 oder 18439 sehen aus wie Prozess-IDs also vielleicht eine Prozess-ID?

16

$$ zu $ umgewandelt werden, aber in Makefile-Regeln (die Schale sind Ausdrücke) müssen Sie auch die resultierende $ mit einem \ oder mit einfachen Anführungszeichen ' um Ihren Ausdruck zu entkommen. Hier

ist ein Beispiel, das es zeigt:

DOLLAR:=$$ 
dollar: 
    echo '$$' > [email protected] 
    echo "\$$" >> [email protected] 
    echo '$(DOLLAR)' >> [email protected] 
    echo "\$(DOLLAR)" >> [email protected] 
    cat dollar 
+1

Gott, ich liebe dich. Ich habe rundherum gesucht, warum sich '$$' für mich ins Nichts ausdehnt. – Profpatsch