Cuidado con recetas como esta
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Hace dos cosas mal. La primera línea de la receta se ejecuta en una instancia de shell separada de la segunda línea. La variable se pierde mientras tanto. La segunda cosa incorrecta es que $
no se ha escapado.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Ambos problemas se han solucionado y la variable es utilizable. La barra invertida combina ambas líneas para ejecutarse en un único shell, por lo tanto, la configuración de la variable y la lectura de las palabras clave variables funcionan.
Me doy cuenta de que la publicación original decía cómo obtener los resultados de un comando de shell en una variable MAKE, y esta respuesta muestra cómo obtenerlo en una variable de shell. Pero otros lectores pueden beneficiarse.
Una mejora final, si el consumidor espera que se establezca una "variable de entorno", entonces debe exportarla.
my_shell_script
echo $MY_ID
necesitaría esto en el archivo MAKE
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Espero que ayude a alguien. En general, uno debe evitar hacer un trabajo real fuera de las recetas, porque si alguien usa el archivo MAKE con la opción '--dry-run', solo para VER lo que hará, no tendrá efectos secundarios indeseables. Cada $(shell)
llamada se evalúa en tiempo de compilación y se puede realizar accidentalmente un trabajo real. Es mejor dejar el trabajo real, como generar identificadores, en el interior de las recetas cuando sea posible.