Tenho várias contas do Amazon EC2 e quero poder alternar rapidamente as variáveis, como $EC2_HOME
, usando um script.
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_HOME
está definido, mas pensei que usar export
faria a variável permanecer após a conclusão do script. Não, porque a execução de echo $EC_HOME
não mostra nada.
Eu sei que isso deve ser um conhecimento de script Linux muito rudimentar, mas eu não sei. tentei procurar perguntas relacionadas sem sorte – então, minhas desculpas se esta for uma duplicata.
Resposta
Você deve fornecer seu script, com
. ./script
ou
source ./script
Comentários
- a razão é que seu script gera um novo processo de shell como filho do shell atual. Quaisquer alterações de ambiente feitas no processo filho não podem afetar o pai. Quando você usa
.
ousource
, você não está gerando um novo processo filho, você está executando os comandos no shell atual. - @glennjackman Tenho um problema semelhante e tentei sua solução, mas ele me desconecta do shell quando faço
.
ousource
. Por que isso acontece pening? - @Patryk: talvez seu script tenha uma declaração
exit
, então não é adequado para fonte. - Enquanto
source ./script
funciona perfeitamente bem,sudo source ./script.sh
dizsudo: source: command not found
. Como posso fazer isso usando sudo? - @ 71GA: dependendo das preferências de compilação para
sudo
e dependendo das configurações em/etc/sudoers
você pode ou não pode preservar seu ambiente ao executar comandos comsudo
. Eu sugiro que você tente o código-fonte de seu script e, em seguida, executesudo
com a opção-E
para preservar o meio ambiente. Se não funcionar, suponho que haja muito pouco que você possa fazer.
Resposta
Quando você executa um script 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, crie 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
Então as definições serão colocadas no ambiente do seu shell atual e herdadas por qualquer programa que você iniciar a partir dele.
Para estar mais perto de executar um script, . a.sh
encontrará a.sh pesquisando os diretórios em PATH
variável de ambiente.
Existem algumas sutilezas em como eles se comportam e se .
e source
são iguais (ou estão presentes). . ./a.sh
definitivamente se comportará da mesma forma em todos os shell compatíveis com POSIX, mas source
e .
, e . a.sh
e . ./a.sh
, podem variar . Para Bash source
e .
são iguais em todos os casos; para zsh source
sempre verifica o diretório atual primeiro ; ksh é essencialmente semelhante.
Se o nome do script for fornecido como um caminho (contendo um /
), esse caminho será usado diretamente em todos os casos. A coisa mais confiável a se fazer é . ./script
ou . /path/to/script
.
Resposta
Apenas para registro.
Se você deseja executar um 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)
Comentários
- Parece perigoso, mas útil se você confia nesse script!
Resposta
Tente
exec ./script
O comando exec executa o script no shell atual sem iniciar o shell não interativo.