Recharger .profile dans le script shell bash (sous unix)?

130

Je suis nouveau dans le scripting shell bash, et j'ai rencontré un défi. Je sais que je peux recharger mon fichier ".profile" en faisant simplement:

. .profile

mais j'essaie d'exécuter la même chose dans un script bash que j'écris et cela ne fonctionne tout simplement pas. Des idées? Y a-t-il autre chose que je peux fournir pour clarifier?

Merci

Amir Rustamzadeh
la source
Comme Ignacio le souligne ci-dessous, votre script s'exécute dans un sous-shell. Le sous-shell ne peut pas modifier le shell principal (le processus enfant ne peut pas modifier son parent). Vous devez donc "source" le script en utilisant le "." command (qui peut également être orthographié comme "source"). Donc, si votre script veut, par exemple, modifier les variables d'environnement, vous devez faire quelque chose comme "source myscript" ou ". Myscript" (ils signifient tous deux la même chose). Cela modifiera l'environnement de votre shell principal. (Je pense que c'est ce que vous essayez de faire, faites-moi savoir si cela ne va pas.)
bstpierre
1
J'ai eu ma réponse à votre question :)
Kolob Canyon

Réponses:

195

Essayez ceci pour recharger votre shell actuel:

source ~/.profile
Kofriel
la source
1
Avez-vous une autre solution? Parce que l'utilisation de la sourcecommande exécutera le fichier en tant que script ... Dans le pire des cas, si quelqu'un utilisait une affectation de variable comme MyVar="$foo$MyVar"dans son bash_profile, alors source ~/.profiledonnerait le résultat final MyVar="$foo$MyVar$MyVar", donc $MyVaraurait la mauvaise valeur par la suite. (Indépendamment des mauvaises pratiques, il suffit de demander une solution alternative)
Jeffrey Mvutu Mabilama
9

Essaye ça:

cd 
source .bash_profile
girardengo
la source
5

Quelques problèmes surviennent lors de la tentative de rechargement du fichier / source ~ / .profile. [Cela fait référence à Ubuntu Linux - dans certains cas, les détails des commandes seront différents]

  1. Exécutez-vous ceci directement dans le terminal ou dans un script?
  2. Comment exécutez-vous cela dans un script?

Un d. 1)

L'exécuter directement dans le terminal signifie qu'aucun sous-shell ne sera créé. Vous pouvez donc utiliser deux commandes:

source ~/.bash_profile

ou

. ~/.bash_profile

Dans les deux cas, cela mettra à jour l'environnement avec le contenu du fichier .profile.

Annonce 2) Vous pouvez démarrer n'importe quel script bash soit en appelant

sh myscript.sh 

ou

. myscript.sh

Dans le premier cas, cela créera un sous-shell qui n'affectera pas les variables d'environnement de votre système et elles ne seront visibles que par le processus du sous-shell. Une fois la commande de sous-shell terminée, aucune des exportations, etc. ne sera appliquée. CECI EST UNE ERREUR COMMUNE ET FAIT PERDRE BEAUCOUP DE DEVELOPPEURS BEAUCOUP DE TEMPS.

Pour que vos modifications appliquées dans votre script aient un effet sur l'environnement global, le script doit être exécuté avec

.myscript.sh

commander.

Afin de vous assurer que votre script n'est pas exécuté dans un sous-groupe, vous pouvez utiliser cette fonction. (Encore une fois, l'exemple est pour le shell 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
}

J'espère que cela dissipe certains des malentendus courants! : D Bonne chance!

twboc
la source
4

Le script bash s'exécute dans un sous-shell distinct. Pour que cela fonctionne, vous devrez également vous procurer cet autre script.

Ignacio Vazquez-Abrams
la source
Je ne suis pas sûr (encore nouveau dans tout cela) de ce que vous entendez exactement par "source" - en utilisant l'autre script. Pourrait s'il vous plaît développer un peu là-dessus. Cependant, j'ai essayé: $. ~ / .profile $. / etc / profile sans succès. Merci beaucoup.
Amir Rustamzadeh
1
@amirrustan: Votre script devra générer votre .profilefichier quelque chose comme ceci: . $HOME/.profileet vous devrez démarrer votre script en l'approvisionnant également. Quelque chose comme. /path/to/yourscript
pause jusqu'à nouvel ordre.
1
@amirrustam s'il vous plaît lire superuser.com/questions/176783/…
lesmana
1

Essayer:

#!/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
la source