Recarregar .profile no script shell bash (no unix)?

130

Sou novo em bash scripts de shell e me deparei com um desafio. Eu sei que posso recarregar meu arquivo ".profile" apenas fazendo:

. .profile

mas estou tentando executar o mesmo em um script bash que estou escrevendo e simplesmente não está funcionando. Alguma ideia? Mais alguma coisa que eu possa fornecer para esclarecer?

obrigado

Amir Rustamzadeh
fonte
Como Ignacio aponta abaixo, seu script está sendo executado em um subshell. O subshell não pode modificar o shell principal (o processo filho não pode modificar seu pai). Então você precisa "originar" o script usando o "." comando (que também pode ser escrito como "fonte"). Portanto, se o seu script quiser, digamos, modificar variáveis ​​de ambiente, você precisará fazer algo como "source myscript" ou ". Myscript" (ambos significam a mesma coisa). Isso modificará o ambiente do seu shell principal. (Que eu acho que é o que você está tentando fazer, deixe-me saber se isso é errado.)
bstpierre
1
Eu tenho a minha resposta da sua pergunta :)
Kolob Canyon

Respostas:

195

Tente isso para recarregar seu shell atual:

source ~/.profile
kofriel
fonte
1
Você tem uma solução alternativa? Porque usar o sourcecomando executará o arquivo como um script ... Nos piores casos, se alguém usasse uma atribuição de variável como MyVar="$foo$MyVar"em seu bash_profile, então source ~/.profiledaria o resultado final MyVar="$foo$MyVar$MyVar", portanto $MyVar, teria o valor errado posteriormente. (Independentemente de más práticas, basta pedir uma solução alternativa)
Jeffrey Mvutu Mabilama
9

Tente o seguinte:

cd 
source .bash_profile
girardengo
fonte
5

Surgem alguns problemas ao tentar recarregar / arquivo de origem ~ / .profile. [Isso se refere ao Ubuntu linux - em alguns casos, os detalhes dos comandos serão diferentes]

  1. Você está executando isso diretamente no terminal ou em um script?
  2. Como você executa isso em um script?

De Anúncios. 1)

Executar isso diretamente no terminal significa que não haverá sub-shell criado. Então você pode usar dois comandos:

source ~/.bash_profile

ou

. ~/.bash_profile

Nos dois casos, isso atualizará o ambiente com o conteúdo do arquivo .profile.

Anúncio 2) Você pode iniciar qualquer script bash chamando

sh myscript.sh 

ou

. myscript.sh

No primeiro caso, isso criará um subshell que não afetará as variáveis ​​de ambiente do seu sistema e elas serão visíveis apenas para o processo do subshell. Após concluir o comando subshell, nenhuma das exportações, etc. será aplicada. Este é um erro comum e faz com que muitos desenvolvedores percam muito tempo.

Para que suas alterações aplicadas em seu script tenham efeito no ambiente global, o script deve ser executado com

.myscript.sh

comando.

Para garantir que seu script não seja executado em um subshel, você pode usar esta função. (Novamente, o exemplo é para o shell do Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

Espero que isso elimine alguns dos mal-entendidos comuns! : D Boa Sorte!

twboc
fonte
4

O script bash é executado em um subshell separado. Para que isso funcione, você também precisará obter esse outro script.

Ignacio Vazquez-Abrams
fonte
Não tenho certeza (ainda novo para tudo isso) o que você quer dizer exatamente com "fonte" - no outro script. Por favor, poderia expandir um pouco sobre isso. No entanto, eu tentei: $. ~ / .profile $. / etc / profile sem sucesso. Muito obrigado.
Amir Rustamzadeh
1
@amirrustan: Seu script precisará originar seu .profilearquivo da seguinte maneira: . $HOME/.profilee você precisará iniciar seu script utilizando-o também. Algo como. /path/to/yourscript
Pausado até novo aviso.
1
@amirrustam, por favor, leia superuser.com/questions/176783/…
lesmana
1

Experimentar:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
tilo
fonte