web-dev-qa-db-fra.com

Rechargez .profile dans un script shell bash (unix)?

Je suis novice dans les scripts Shell et j'ai rencontré un défi. Je sais que je peux recharger mon fichier ".profile" simplement en faisant:

. .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? Quelque chose d'autre que je peux fournir pour clarifier?

Merci

114
Amir Rustamzadeh

Essayez ceci pour recharger votre shell actuel:

source ~/.profile
173
kofriel

Essaye ça:

cd 
source .bash_profile
9
girardengo

Le script bash s'exécute dans un sous-shell distinct. Afin de faire ce travail, vous aurez besoin de source également cet autre script.

4

Quelques problèmes se posent lorsque vous essayez de recharger/source le fichier ~/.profile. [Cela concerne Ubuntu linux - dans certains cas, les détails des commandes seront différents]

  1. Est-ce que vous l'exécutez directement dans un 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 l'une des deux commandes suivantes:

source ~/.bash_profile

ou

. ~/.bash_profile

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

Ad 2) Vous pouvez lancer n’importe quel script bash 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 celles-ci ne seront visibles que par le processus du sous-shell. Une fois la commande subshell terminée, aucune des exportations, etc. ne sera appliquée. CECI IS UNE ERREUR COMMUNE ET PERMET À BEAUCOUP DE DÉVELOPPEURS DE PERDRE BEAUCOUP DE TEMPS.

Pour que vos modifications appliquées dans votre script aient un effet sur l'environnement global, vous devez exécuter le script avec

.myscript.sh

commander.

Pour vous assurer que votre script n'est pas exécuté dans un sous-marin, vous pouvez utiliser cette fonction. (Encore une fois, l'exemple concerne Ubuntu Shell)

#/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 efface certains des malentendus communs! : D bonne chance!

2
twboc

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 "$@"
1
tilo