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 à ~/.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.
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
~/.bash_profile
provient uniquement de bash lorsqu'il est démarré en mode de connexion interactive. C’est généralement le cas uniquement lorsque vous vous connectez à la console (Ctrl+Alt+F1..F6), ou se connecter via ssh.
Lorsque vous vous connectez graphiquement, ~/.profile
sera spécifiquement identifié par le script qui lance gnome-session (ou l’environnement de bureau que vous utilisez). Donc, ~/.bash_profile
n'est pas du tout source lorsque vous vous connectez graphiquement.
Lorsque vous ouvrez un terminal, celui-ci démarre en mode interactif (sans connexion), ce qui signifie qu'il source ~/.bashrc
.
Le bon endroit pour placer ces variables d’environnement est dans ~/.profile
, et l’effet devrait être apparent à la prochaine connexion.
La recherche de ~/.bash_profile
à partir de ~/.bashrc
n'est pas la bonne solution. C'est censé être l'inverse. ~/.bash_profile
devrait source ~/.bashrc
.
Voir DotFiles pour une explication plus détaillée, incluant un historique des raisons pour lesquelles c'est comme ça.
(Remarque: lors de l'installation d'Openjdk via apt, les liens symboliques doivent être configurés par le paquet, de sorte que vous n'avez pas vraiment besoin de définir Java_HOME
ou de modifier PATH
.)
Vous pouvez vérifier si votre shell Bash est lancé en tant que shell de connexion en exécutant:
shopt login_Shell
Si la réponse est off
, vous n'exécutez pas de shell de connexion.
Lisez la section invocation du manuel de Bash sur la façon dont Bash lit (ou ne lit pas) différents fichiers de configuration.
Extrait de man bash
:
Lorsque bash est appelé en tant que shell de connexion interactif ou non interactif avec l'option
--login
, il lit et exécute d'abord les commandes du fichier/etc/profile
, si ce fichier existe. Après avoir lu ce fichier, il recherche dans cet ordre~/.bash_profile
,~/.bash_login
et~/.profile
, puis lit et exécute les commandes de la première qui existe et est lisible.
De plus, su
ne démarre pas non plus un shell de connexion, vous devez le lui dire en utilisant l’option --login
.
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".
Si vous ouvrez un terminal ou exécutez su
, le shell 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écuter su
avec l'option -l
pour lui permettre d'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; il est donc conseillé de placer tous vos éléments dans ~/.bashrc
.
TL; DR
Dans la configuration classique recommandée d'ubuntu, ~/.bash_profile
n'est évalué que dans des cas spécifiques. Et c'est logique.
Mettez vos données dans ~/.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
name__, car le shell sera le père de tous les processus, il chargera votre ~/.bash_profile
.gnome-session
pour Ubuntu classique) sera chargé de lire.profile
.Ok, alors où mettre mes affaires?
C'est assez complexe, le 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 n fichier qui est évalué quel que soit le mécanisme d'invocation.Ceci est une suggestion rapide de l'endroit où placer les choses.
~/.bashrc (Gets évalué dans toutes les occasions, à condition que vous suiviez la recommandation)
Pour la variable d’environnement fast-evaluation et le code de votre utilisation tilisateur seulement et bash-seulement (alias par exemple). bashism sont les bienvenus.
Il se charge sur lui-même sur:
bash
name__screen
nouveau volet ou onglet. (pas tmux
name__!)terminator
name __/gnome-terminal
...) si vous ne cochez pas l'option "exécuter la commande en tant que login Shell".Et il sera chargé dans toutes les autres occasions grâce à la recommandation préalable.
~/.bash_profile (Gets évalué lors d'une occasion spécifique seulement)
Pour la variable d'environnement slow-evaluation et le code de vos processus tilisateur uniquement et session-console. bashism sont les bienvenus. Il est chargé sur:
tmux
nouveau volet ou fenêtres (paramètres par défaut), (pas screen
name__!)bash -l
,terminator
name __/gnome-terminal
...) only if vous cochez l’option "run command as login login".~/.profile (Gets évalué uniquement en session graphique)
Pour les variables d'environnement slow-evaluation et avec no-bashism pour vos processus tilisateur uniquement et tous graphical-session . Il se charge lors de la connexion dans votre interface graphique.