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 . ou source, 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 . ou source. 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 diz sudo: 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 com sudo. Eu sugiro que você tente o código-fonte de seu script e, em seguida, execute sudo 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *