Cuidado com receitas como esta
target:
MY_ID=$(GENERATE_ID);
echo $MY_ID;
Faz duas coisas erradas. A primeira linha da receita é executada em uma instância de shell separada da segunda linha. Enquanto isso, a variável é perdida. A segunda coisa errada é que $
não se escapa.
target:
MY_ID=$(GENERATE_ID); \
echo $$MY_ID;
Ambos os problemas foram corrigidos e a variável é utilizável. A barra invertida combina as duas linhas para serem executadas em um único shell; portanto, a configuração da variável e a leitura das palavras posteriores da variável funcionam.
Percebo que o post original dizia como obter os resultados de um comando shell em uma variável MAKE, e essa resposta mostra como obtê-lo em uma variável shell. Mas outros leitores podem se beneficiar.
Uma melhoria final, se o consumidor espera que uma "variável de ambiente" seja definida, você precisará exportá-la.
my_shell_script
echo $MY_ID
precisaria disso no makefile
target:
export MY_ID=$(GENERATE_ID); \
./my_shell_script;
Espero que ajude alguém. Em geral, deve-se evitar fazer qualquer trabalho real fora das receitas, porque se alguém usar o makefile com a opção '--dry-run', apenas para ver o que ele fará, não terá efeitos colaterais indesejáveis. Cada $(shell)
chamada é avaliada em tempo de compilação e algum trabalho real pode ser feito acidentalmente. Melhor deixar o trabalho real, como gerar IDs, para dentro das receitas, quando possível.