Dado um arquivo .env com uma variável DB_USER=foo@bar
, para um Makefile:
.ONESHELL:
SHELL:=/bin/bash
all:
set -o allexport;source .env ;set +o allexport && echo $(DB_USER)
e
$ make all
$ set -o allexport;source .env ;set +o allexport && echo
testar isso no terminal funciona:
$ set -o allexport;source .env ;set +o allexport; && echo $DB_USER
$ foo@bar
como consertar isso no makefile?
Mudar
echo $(DB_USER)
paraecho $$DB_USER
.Então:
Por que?
A receita está sendo executada em um shell cujo pai é
make
.$(DB_USER)
refere-se a uma variável make que é indefinida nomake's
ambiente.$DB_USER
é uma referência a uma variável no ambiente do shell filho, que você definiu no.env
arquivo desse mesmo shell, para que possa referenciá-la potencialmente. Um processo filho não pode enviar variáveis de ambiente para seu pai e, mesmo que pudesse, é inútil: é apenas o shell em execução que precisa do valor.Você precisa escapar
$DB_USER
como$$DB_USER
no contexto da receita, caso contráriomake
irá expandir$DB_USER
=$(D)B_USER
=B_USER
antes mesmo de a receita ser executada. Manual GNU Make: 6.1 Noções básicas de referências de variáveisDa mesma forma, você sempre precisa escapar
$shellvar
como$$shellvar
no contexto da receita.