Vorsicht vor solchen Rezepten
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Es macht zwei Dinge falsch. Die erste Zeile im Rezept wird in einer von der zweiten Zeile getrennten Shell-Instanz ausgeführt. Die Variable geht in der Zwischenzeit verloren. Das zweite, was falsch ist, ist, dass das $
nicht entkommen ist.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Beide Probleme wurden behoben und die Variable ist verwendbar. Der Backslash kombiniert beide Zeilen, um in einer einzigen Shell ausgeführt zu werden. Daher funktioniert die Einstellung der Variablen und das Lesen der variablen Nachwörter.
Mir ist klar, dass im ursprünglichen Beitrag gesagt wurde, wie die Ergebnisse eines Shell-Befehls in eine MAKE-Variable übernommen werden, und diese Antwort zeigt, wie man sie in eine Shell-Variable umwandelt. Aber andere Leser können davon profitieren.
Eine letzte Verbesserung: Wenn der Verbraucher erwartet, dass eine "Umgebungsvariable" festgelegt wird, müssen Sie sie exportieren.
my_shell_script
echo $MY_ID
würde dies im Makefile brauchen
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Hoffe das hilft jemandem. Im Allgemeinen sollte man es vermeiden, echte Arbeit außerhalb von Rezepten zu leisten, denn wenn jemand das Makefile mit der Option '--dry-run' verwendet, um nur zu sehen, was es tun wird, hat es keine unerwünschten Nebenwirkungen. Jeder $(shell)
Aufruf wird zur Kompilierungszeit ausgewertet, und es könnte versehentlich echte Arbeit geleistet werden. Überlassen Sie die eigentliche Arbeit, wie das Generieren von IDs, nach Möglichkeit dem Inneren der Rezepte.