Problème
J'ai une machine virtuelle Ubuntu 11.04 et je voulais configurer mon environnement de développement Java. J'ai fait comme suit
sudo apt-get install openjdk-6-jdk
Ajout des entrées suivantes dans ~ / .bash_profile
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk export PATH=$PATH:$JAVA_HOME/bin
Enregistrez les modifications et quittez
Ouvrez à nouveau un terminal et tapez ce qui suit
echo $JAVA_HOME (blank) echo $PATH (displayed, but not the JAVA_HOME value)
Rien ne s'est passé, comme si l'exportation de JAVA_HOME et son ajout au PATH n'étaient jamais terminés.
Solution
Je devais aller à ~ / .bashrc et ajouter l'entrée suivante vers la fin du fichier
#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile
Des questions
- Pourquoi devais-je faire ça? Je pensais que bash_profile, bash_login ou profil en l’absence de ces deux-là s’exécutait d’abord avant bashrc.
- Mon terminal était-il dans ce cas un shell sans connexion ?
- Si tel est le cas, pourquoi lorsque vous faites su après le terminal et que vous mettez le mot de passe, il n’exécute pas le profil dans lequel j’ai également défini les exportations susmentionnées?
.profile
ne devrait provenir que de la connexion..profile
bash ignore si elle.bash_profile
existe. Voir ma réponse ici etman bash
pour plus de détails..profile
.Vous pouvez vérifier si votre shell Bash est lancé en tant que shell de connexion en lançant:
Si la réponse est que
off
vous n'exécutez pas un shell de connexion.Lisez la section sur l' invocation du manuel Bash pour savoir comment Bash lit (ou ne lit pas) différents fichiers de configuration.
Extrait de
man bash
:su
D'autre part, ne lance pas non plus un shell de connexion par défaut, vous devez le lui dire en utilisant l'--login
option.la source
Je pense qu'il vaut la peine de mentionner que vous pouvez changer la valeur par défaut de gnome-terminal pour utiliser un shell de connexion (par exemple, bash -l) en modifiant les préférences de profil.
allez dans Edition -> Préférences de profil -> Titre et commande, cochez la case "Exécuter la commande en tant que shell de connexion"
la source
~/.bash_profile
évaluation est très rapide, ce qui est probablement le cas. Une bonne chose à vérifier est de chasser tous les appels à d’autres processus qui sont généralement assez coûteux.Si vous ouvrez un terminal ou exécutez
su
le shell, celui-ci n’est pas exécuté en tant que shell de connexion, mais en tant que shell interactif normal. Donc, il lit~/.bashrc
mais pas~/.bash_profile
. Vous pouvez exécutersu
avec l'-l
option pour le faire exécuter votre shell en tant que shell de connexion.Lorsque vous travaillez avec une interface graphique, le shell n’est généralement jamais exécuté en tant que shell de connexion
~/.bashrc
;la source
TL; DR
Dans la configuration classique recommandée d'ubuntu,
~/.bash_profile
est évalué uniquement à des occasions spécifiques. Et c'est logique.Mettez vos affaires
~/.bashrc
, elles seront évaluées à chaque fois.Ok, je veux comprendre, pourquoi cela a-t-il un sens?
Points clés pour comprendre ce qui se passe:
Donc, le temps de "connexion" est typiquement:
ssh
, car le shell sera le père de tous les processus, il chargera votre fichier~/.bash_profile
.gnome-session
pour ubuntu classique) sera chargé de lire.profile
.Ok, alors où mettre mes affaires?
C'est assez complexe, l' histoire complète est ici . Mais voici un récit assez commun pour les utilisateurs d'ubuntu. Donc, considérant que:
bash
shell,~/.bash_profile
et suivez la recommandation d’ajouter le chargement de~/.bashrc
dans votre~/.bash_profile
afin d’obtenir au moins un fichier qui sera évalué quel que soit le mécanisme d’invocation .Ceci est une suggestion rapide de l'endroit où placer les choses.
~ / .bashrc (est évalué dans toutes les occasions , à condition que vous suiviez la recommandation)
Pour évaluation rapide variable d'environnement et le code pour votre utilisateur uniquement et bash seule utilisation en ligne de commande (alias , par exemple). les bashismes sont les bienvenus.
Il se charge sur lui-même sur:
bash
screen
nouveau volet ou onglet. (pastmux
!)terminator
/gnome-terminal
...) si vous ne cochez pas l' option "exécuter la commande en tant que shell de connexion".Et il sera chargé dans toutes les autres occasions grâce à la recommandation préalable.
~ / .bash_profile (Obtient évalué dans une occasion spécifique seulement )
Pour variable d’environnement d’ évaluation lente et code pour vos processus de session utilisateur et console uniquement . les bashismes sont les bienvenus. Il est chargé sur:
tmux
nouveau volet ou nouvelle fenêtre (paramètres par défaut), (passcreen
!)bash -l
,terminator
/gnome-terminal
...) uniquement si vous cochez l'option "Exécuter la commande en tant que shell de connexion".~ / .profile (Gets évalué uniquement en session graphique)
Pour les variables d'environnement à évaluation lente et sans nohisme pour vos processus de session utilisateur uniquement et graphiques . Il se charge lors de la connexion dans votre interface graphique.
la source
.profile
s’il.bash_profile
n’existe pas.env
fais pas, je ne vois pas les variables env définies (j'ai essayé de fermer iTerm et de le rouvrir). Mais j’ai remarqué que lorsque j’ai installé Android studio et d’autres applications, tous ces paramètres étaient configurés/.bash_profile
. Alors, quand j'ai ajouté/.bash_profile
ça a fonctionné comme un charme. Pourquoi donc?