Como exportar variáveis ​​de um arquivo?

80

Eu tenho um tmp.txtarquivo que contém variáveis ​​a serem exportadas, por exemplo:

a=123
b="hello world"
c="one more variable"

Como posso exportar todas essas variáveis ​​usando o exportcomando, para que possam ser usadas posteriormente por processos filhos?

Neerav
fonte
1
bash-arquivo --init somefile.blah -c "comando"
Dillian Murphey
O SO tem uma resposta útil sobre como gerar .envarquivos automaticamente quando você cdentra em um diretório.
Dan Dascalescu
@ Neerav Por favor, aceite a outra resposta. Essa é uma solução muito melhor.
coderDude 18/07

Respostas:

65
source tmp.txt
export a b c
./child ...

A julgar pela sua outra pergunta, você não deseja codificar os nomes das variáveis:

source tmp.txt
export $(cut -d= -f1 tmp.txt)

teste-o:

$ source tmp.txt
$ echo "$a $b $c"
123 hello world one more variable
$ perl -E 'say "@ENV{qw(a b c)}"'

$ export $(cut -d= -f1 tmp.txt)
$ perl -E 'say "@ENV{qw(a b c)}"'
123 hello world one more variable
Glenn Jackman
fonte
2
Isso não funcionará se o arquivo de ambiente contiver comentários, por exemplo. (por exemplo, arquivos que podem ser reutilizados por EnvironmentFile das systemd.)
Chris Lamb
3
@ChrisLamb você pode usar greppara pular comentários:export $(grep --regexp ^[A-Z] tmp.txt | cut -d= -f1)
gvee
182
set -a
. ./tmp.txt
set +a

set -afaz com que as variáveis¹ definidas a partir de agora sejam exportadas automaticamente. Está disponível em qualquer shell tipo Bourne. .é o nome padrão e Bourne para o sourcecomando, então prefiro-o para portabilidade ( sourcevem cshe agora está disponível na maioria dos shells modernos semelhantes a Bourne, incluindo bash(às vezes com um comportamento ligeiramente diferente)).

Nos shells POSIX, você também pode usar set -o allexportcomo uma maneira alternativa mais descritiva de escrevê-lo ( set +o allexportpara desabilitar).


¹ bashLembre-se de que também faz com que todas as funções declaradas enquanto allexportestejam exportadas para o ambiente (como BASH_FUNC_myfunction%%variáveis ​​de ambiente que são importadas por todos os bashshells executadas nesse ambiente, mesmo quando executadas como sh).

Stéphane Chazelas
fonte
1

Apenas faça:

while read LINE; do export "$LINE"; done < ./tmp.txt
benjamin berhault
fonte
Você verificou se isso funciona?
RalfFriedl 01/07
@RalfFriedl isso deve funcionar, por que não? Não é muito elegante e o fornecimento set -aseria muito mais simples, mas isso realmente funciona.
terdon
Isso é quebradiço. Ele não permite comentários no arquivo de entrada, não manipula valores de variáveis ​​entre aspas corretamente e falha em variáveis ​​com várias linhas. É verdade que não tenho muitas variáveis ​​com várias linhas, mas uso comentários regularmente e frequentemente preciso usar aspas para valores de variáveis.
Louis
Funcionou para mim.
mchawre