Como posso manter variáveis ​​de ambiente "exportadas" em um script de shell?


54

Tenho várias contas do Amazon EC2 e desejo poder alternar rapidamente variáveis, como $EC2_HOMEusar um script.

Eu tenho um script de shell configurado assim:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Quando executo o script, sei que EC2_HOMEestá definido, mas pensei que o uso exportfaria a variável permanecer após a conclusão do script. Isso não acontece, pois a execução echo $EC_HOMEnão mostra nada.

Eu sei que isso deve ser um conhecimento de script do Linux muito rudimentar, mas não o conheço. Tentei procurar perguntas relacionadas sem sorte - portanto, peço desculpas se for uma cópia.

Respostas:


60

Você deve fonte seu script, com

. ./script

ou

source ./script

19
o motivo é que seu script gera um novo processo de shell como filho do shell atual. Quaisquer alterações no ambiente que você fizer no processo filho não podem afetar o pai. Quando você usa .ou sourcenão está gerando um novo processo filho, está executando os comandos no shell atual.
Glenn Jackman

11
@glennjackman Eu tenho um problema semelhante e tentei sua solução, mas ela me desconecta do shell quando eu faço isso .ou source. Por que isso está acontecendo ?
Patryk

7
@ Patryk: talvez o seu script tenha uma exitdeclaração, por isso não é adequado obter fontes.
enzotib

Enquanto source ./scriptfunciona completamente bem, sudo source ./script.shdiz sudo: source: command not found. Como posso fazer isso usando o sudo?
71

11
@ 71GA: dependendo das preferências de compilação sudoe das definições de configuração, /etc/sudoersvocê pode ou não pode preservar seu ambiente ao executar comandos com sudo. Eu sugiro que você tente fonte seu script e, em seguida, execute sudocom a -Eopção para preservar o ambiente. Se não funcionar, suponho que você pode fazer muito pouco.
enzotib 27/09/14

35

Quando você executa um script, ele obtém seu próprio shell e seu próprio ambiente, que desaparecem novamente assim que o script é concluído. Para manter as variáveis ​​de ambiente por perto, origine o script em seu shell atual:

$ source ./a.sh

ou de forma equivalente (mas um pouco mais portável) use o comando ponto POSIX :

$ . ./a.sh

Em seguida, as definições serão colocadas no ambiente atual do shell e serão herdadas por quaisquer programas iniciados a partir dele.

Para estar mais perto de executar um script, . a.shvocê encontrará o a.sh pesquisando os diretórios na PATHvariável de ambiente.


Existem algumas sutilezas na forma como elas se comportam e se são .e sourcesão iguais (ou presentes). . ./a.shdefinitivamente se comportará da mesma maneira em todos os shell compatíveis com POSIX, mas sourceand ., and . a.she . ./a.sh, podem variar. Para o Bash sourcee .são iguais em todos os casos; O zsh sourcesempre verifica primeiro o diretório atual ; O ksh é essencialmente semelhante.

Se o nome do script for fornecido como um caminho (contendo a /), esse caminho será usado diretamente em todos os casos. A coisa mais portávelmente confiável a fazer é . ./scriptou . /path/to/script.


1

Apenas para registro.

Se você deseja executar o script da internet que exporta env para o sistema

você pode usar o seguinte formato

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Por exemplo:

source <(curl -s -L https://example.com/install.sh)

Parece perigoso, mas útil se você confiar nesse script!
Mark Stewart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.