Nota: Este tópico geral parece ser abordado ad nauseum em mais de um site da SE, mas leia todos os detalhes — não encontrei nenhuma pergunta que abranja todos os critérios descritos abaixo.
Além disso: estou usando
zsh
nos exemplos abaixo. Espero uma solução compatível com POSIX, mas isso não é um requisito difícil: algo que funcionebash
ezsh
seja bom o suficiente.
Aqui está um exemplo para ajudar a esclarecer o título da pergunta:
Digamos que eu tenha os dois arquivos a seguir:
% ls -AF
.env printenv*
% cat printenv
echo $LOCAL_MESSAGE_1
echo $LOCAL_MESSAGE_2
% cat .env
LOCAL_MESSAGE_1="hello world"
LOCAL_MESSAGE_2="goodnight moon"
e gostaria de executar o script printenv
e ver o seguinte em stdout
:
hello world
goodnight moon
Se essas variáveis não existirem em meu ambiente, o script imprimirá linhas vazias (como esperado):
% unset LOCAL_MESSAGE_1
% unset LOCAL_MESSAGE_2
% ./printenv
Se eu definir as variáveis antes de executar o script, elas ficarão disponíveis para ele, mas apenas para esse único processo e não para processos subsequentes iniciados no mesmo shell:
% LOCAL_MESSAGE_1="hello world" LOCAL_MESSAGE_2="goodnight moon" ./printenv
hello world
goodnight moon
% ./printenv
Então, minha pergunta é a seguinte: como posso replicar o comportamento do último exemplo de acordo com os seguintes critérios?
- execute
printenv
sem modificação no shell atual — não em um subshell (obrigado RudiC ) — e obtenha a saída desejada, enquanto também - carregando as variáveis do
.env
arquivo, enquanto também - mantendo as variáveis locais para a chamada do processo: elas permanecerão indefinidas no ambiente shell e nos processos subseqüentes sem precisar
unset
delas
Que sintaxe de linha única posso usar para fazer isso? O que deve ser substituído no lugar dos pontos de interrogação abaixo para atender aos critérios acima?
% ?????????? ./printenv
hello world
goodnight moon