Use o comando bash "source" dessa maneira:
source env_var.txt
Todas as variáveis devem ser importadas.
Para mais informações: link
Eu gostaria de importar todas as variáveis 'env' de outra caixa para uma máquina local. Eu copiei as variáveis env para env_var.txt na caixa local. Eu realizei o seguinte:
for i in 'cat env_var.txt'; do export $i; done
No entanto, isso não parece definir todas as minhas variáveis de env corretamente. Eu modifiquei
do export $i
em
do echo $i
e as variáveis parecem exibir tudo bem. O que poderia estar causando este problema. Ou existe uma maneira alternativa de importar todas as variáveis env?
Use o comando bash "source" dessa maneira:
source env_var.txt
Todas as variáveis devem ser importadas.
Para mais informações: link
TL, DR: exportar com
export -p >env_var.sh
e importe com
. env_var.sh
Se o seu código funciona depende do formato env_var.txt
e quais caracteres especiais (ou seja, caracteres que têm um significado especial na sintaxe do shell) estão presentes nos nomes e valores das variáveis.
'cat env_var.txt'
é uma substituição de comando sem aspas. Deixar uma substituição de comando variável não indicada aplica o operador “split + glob” a ela: primeiro divida a saída do comando nos caracteres no valor da variável IFS
, interprete cada parte como um padrão curinga de nome de arquivo e substitua cada padrão que corresponde a alguns arquivos pelos nomes dos arquivos correspondentes. O resultado é uma lista de palavras com as quais o loop for
itera.
Uma substituição de comando sem aspas raramente é o que você quer, e neste caso definitivamente não é o que você quer. Isso funciona, no entanto, se a sintaxe do arquivo for, por exemplo, a saída de env
e os valores das variáveis não contêm nenhum *?\[
ou espaço em branco .
Se env_var.txt
for a saída de env
, você poderá obter melhores resultados se a analisar de acordo com sua sintaxe real (atribuições separadas por nova linha), em vez de usar um método de análise que não faz sentido. Se você quiser usar o operador split + glob, que é a maneira mais fácil de fazer isso, defina IFS
para ser apenas uma nova linha e a correspondência de caractere curinga.
set -f; IFS='
'
export 'cat env_var.txt'
set +f; unset IFS
Há um problema que você não pode resolver no lado do destinatário, no entanto, que é a saída de env
é ambígua. Dado o seguinte conteúdo:
foo=bar
hello=world
não há como saber se há duas variáveis (uma chamada foo
com o valor bar
e uma chamada hello
com o valor world
) ou apenas uma que é chamada foo
com o valor
bar
hello=world
Para exportar as variáveis de ambiente de maneira não ambígua, não use env
, use export
. O comando export -p
lista os valores de todas as variáveis de ambiente de uma maneira que pode ser analisada pelo shell. Então, no lado da exportação, corra
export -p >env_var.sh
No lado da importação, execute
. env_var.sh
Ressalva: no bash, a saída de export -p
é passível de análise, mas apenas por bash. Para obter uma saída que funcione em outros shells sh-style, defina POSIXLY_CORRECT
para qualquer valor de valor. Isso não tem efeito prejudicial em outros shells, então você pode apenas fazer
(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh
Configurar POSIXLY_CORRECT
para o valor que tinha antes não faz diferença na saída - ou não estava no ambiente e não será depois de executar isso, ou foi no ambiente e valor não muda. Mas é o suficiente para forçar o bash a usar a sintaxe portátil com export
na saída de export -p
em vez de uma sintaxe específica do bash com declare
.
Observe que a importação de variáveis de ambiente pode levar à execução de código arbitrário, portanto, importe somente env_var.txt
ou env_var.sh
de uma fonte em que você confia. O culpado são as variáveis de ambiente, não o fato de que . env_var.sh
executa o código: apenas importar variáveis como PATH
, LD_PRELOAD
, ENV
etc. pode levar à execução de código mais adiante na linha.