2016-04-20 13 views
2

Ich versuche, eine einfache Makefile zu schreiben, die im folgenden ähneln:Shell Commend nicht für erstes Mal arbeitet

all: 
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \ 
    export FILEPATH=$(dir $(shell find /home/developer/data/test/ -type f -name sample.txt)) && \ 
    echo $$FILEPATH 

Als ich zum ersten Mal Echo ausführen mache null ist (das heißt nichts gedruckt werden). Aber wenn ich denselben ausführe, ohne den Verzeichnistest zu entfernen, wird es den richtigen Pfad für Echo drucken.

Aber sobald Sie das Testverzeichnis wieder entfernen und machen Echo ist Null.

Was mache ich hier falsch?

+0

Ich denke, es sollte '$ FILEPATH' mit Single' $ 'sein, nicht zwei' $$ 'wie du hast – Entea

+0

@Entea Dies ist in einem Make-Rezept. Das doppelte '$$' ist korrekt. –

Antwort

2

Dies ist ein Zeitproblem.

Sie erwarten, dass der gesamte Inhalt des Rezeptkörpers zur Rezeptausführungszeit ausgeführt wird, aber das passiert nicht.

Die make-Konstrukte im Rezeptkörper führen zuerst aus und werden in den Rezeptkörper expandiert, der dann von der Shell ausgeführt wird.

So $(dir $(shell ...)) läuft vor einem der Shell-Befehle ausführen und so gibt es nichts für find das erste Mal zu finden.

Springen Sie nicht in und aus make Kontexte wie das. Wenn Sie einen Shell-Befehl im Shell-Kontext ausführen möchten, tun Sie dies.

all: 
    mkdir -p /home/developer/data/test/ && \ 
    cp /home/developer/data/sample.txt /home/developer/data/test/ && \ 
    FILEPATH=$$(dirname $$(find /home/developer/data/test/ -type f -name sample.txt)) && \ 
    echo $$FILEPATH 

Beachten Sie auch, dass export es nicht notwendig war und nicht überhaupt etwas für Sie tun.

+0

Danke für die ausführliche Erklärung ... Es hat geklappt .. –

Verwandte Themen