Fai attenzione a ricette come questa
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Fa due cose sbagliate. La prima riga della ricetta viene eseguita in un'istanza di shell separata dalla seconda riga. La variabile si perde nel frattempo. La seconda cosa che non va è che $
non è sfuggito.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Entrambi i problemi sono stati risolti e la variabile è utilizzabile. La barra rovesciata combina entrambe le righe per l'esecuzione in una singola shell, quindi l'impostazione della variabile e la lettura delle parole secondarie della variabile funzionano.
Mi rendo conto che il post originale diceva come ottenere i risultati di un comando shell in una variabile MAKE, e questa risposta mostra come inserirlo in una variabile shell. Ma altri lettori potrebbero trarne beneficio.
Un miglioramento finale, se il consumatore prevede di impostare una "variabile d'ambiente", è necessario esportarla.
my_shell_script
echo $MY_ID
avrebbe bisogno di questo nel makefile
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Spero che aiuti qualcuno. In generale, si dovrebbe evitare di fare qualsiasi lavoro reale al di fuori delle ricette, perché se qualcuno usa il makefile con l'opzione '--dry-run', per VEDERE solo ciò che farà, non avrà effetti collaterali indesiderati. Ogni $(shell)
chiamata viene valutata al momento della compilazione e alcuni lavori reali potrebbero essere eseguiti accidentalmente. Meglio lasciare il vero lavoro, come generare ID, all'interno delle ricette quando possibile.