218 votes

Pourquoi ~/.bash_profile ne s'affiche pas à l'ouverture d'un terminal ?

Problème

J'ai une machine virtuelle Ubuntu 11.04 et je voulais configurer mon environnement de développement Java. J'ai procédé comme suit

  1. sudo apt-get install openjdk-6-jdk

  2. Les entrées suivantes ont été ajoutées à ~/.bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
  3. Enregistrez les modifications et quittez

  4. Ouvrez à nouveau un terminal et tapez ce qui suit

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
  5. Rien ne s'est produit, comme si l'exportation de JAVA_HOME et son ajout au PATH n'avaient jamais été effectués.

Solution

J'ai dû aller à ~/.bashrc et ajoutez 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

Questions

  1. Pourquoi ai-je dû faire ça ? Je pensais que bash_profile, bash_login ou profile en l'absence de ces deux-là étaient exécutés en premier avant bashrc.
  2. Dans ce cas, mon terminal était un non-login Shell ?
  3. Si c'est le cas, pourquoi en faisant su après le terminal et en mettant le mot de passe, il n'a pas exécuté le profil où j'avais également défini les exportations mentionnées ci-dessus ?

276voto

Steve Karg Points 11

~/.bash_profile est uniquement utilisé par bash lorsqu'il est lancé en mode connexion. C'est généralement le cas lorsque vous vous connectez à la console ( Ctrl + Alt + F1 .. F6 ), se connecter via ssh, ou utiliser sudo -i o su - pour exécuter des commandes en tant qu'autre utilisateur.

Lorsque vous vous connectez graphiquement, ~/.profile sera spécifiquement sourcé par le script qui lance gnome-session (ou tout autre environnement de bureau que vous utilisez). Donc ~/.bash_profile n'est pas sourcée du tout lorsque vous vous connectez graphiquement.

Lorsque vous ouvrez un terminal, celui-ci démarre bash en mode interactif (sans login), ce qui signifie qu'il extrait les sources suivantes ~/.bashrc .

Le bon endroit pour placer ces variables d'environnement se trouve à l'endroit suivant ~/.profile et l'effet devrait être visible la prochaine fois que vous vous connecterez.

Recherche de fournisseurs ~/.bash_profile de ~/.bashrc est la mauvaise solution. C'est censé être l'inverse ; ~/.bash_profile devrait être la source ~/.bashrc .

Voir DotFiles pour une explication plus approfondie, y compris un historique des raisons pour lesquelles il est comme il est.

(En passant, lors de l'installation d'openjdk via apt, les liens symboliques devraient être mis en place par le paquetage, de sorte que vous n'avez pas vraiment besoin de mettre en place le paramètre JAVA_HOME ou de changer PATH )

57voto

lgarzo Points 18302

Vous pouvez vérifier si votre Shell Bash est démarré en tant que login-Shell en exécutant :

shopt login_shell

Si la réponse est off vous n'exécutez pas un Shell de connexion.

Lisez le manuel Bash invocation sur la façon dont Bash lit (ou ne lit pas) les différents fichiers de configuration.

Extrait de man bash :

Lorsque bash est invoqué en tant que login interactif Shell, ou en tant que non interactif Shell avec l'icône --login l'option, il lit d'abord et exécute les commandes du fichier /etc/profile si ce fichier existe. Après avoir lu ce fichier, il recherche ~/.bash_profile , ~/.bash_login y ~/.profile dans cet ordre, et lit et exécute les commandes à partir de la première qui existe et qui est lisible.

su d'autre part ne démarre pas non plus un Shell de connexion par défaut, vous devez lui dire de le faire en utilisant la commande --login option.

37voto

NateB Points 1

Je pense qu'il est utile de mentionner que vous pouvez changer le défaut de gnome-terminal pour utiliser un login Shell (ie. bash -l) en éditant les préférences du profil.

allez dans Édition -> Préférences du profil -> onglet Titre et Commande cochez l'option "Exécuter la commande comme un Shell de connexion".

17voto

Fabiano Soriani Points 543

Si vous ouvrez un terminal ou exécutez su le Shell n'est pas exécuté comme un Shell de connexion mais comme un Shell interactif normal. Ainsi, on peut lire ~/.bashrc mais pas ~/.bash_profile . Vous pouvez exécuter su avec le -l pour qu'il exécute votre Shell comme un 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, de sorte qu'il est généralement bien de mettre tout votre matériel dans ~/.bashrc .

12voto

vaab Points 1054

TL;DR

Dans la configuration classique recommandée d'Ubuntu, ~/.bash_profile n'est évalué que dans des occasions spécifiques. Et c'est logique.

Mettez vos affaires dans ~/.bashrc il sera évalué à chaque fois.

Ok, je veux comprendre, pourquoi cela a-t-il un sens ?

Points clés pour comprendre ce qui se passe :

  • todo processus sur linux ont et utilise l'environnement variables
  • Les variables d'environnement sont hérité de
  • les mettant ainsi une fois sur le père de tout votre processus est suffisant (surtout s'il nécessite un certain temps de calcul).
  • le père de tous vos processus est généralement lancé après que vous avez s'identifier sur votre appareil (donnez vos informations d'identification).
  • il y a des choses que vous pouvez vouloir faire une seule fois lorsque vous vous connectez sur votre ordinateur (vérifier l'arrivée de nouveaux messages, par exemple...).

Le temps de "connexion" est donc typique :

  • En mode console, lorsque vous vous connectez (avec Ctrl-Alt F1) ou par l'intermédiaire de ssh , comme le Shell sera le père de tous les processus, il chargera votre ~/.bash_profile .
  • En mode graphique, lorsque vous ouvrez votre session, le premier processus ( 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 compte-rendu qui est assez commun pour les utilisateurs d'ubuntu. Donc en considérant cela :

  • vous utilisez bash Shell,
  • vous avez un ~/.bash_profile et suivre les recommandation pour ajouter le chargement de ~/.bashrc dans votre ~/.bash_profile afin d'obtenir au moins un fichier qui est évalué quelle que soit l'invocation. Mécanisme .

Il s'agit d'une suggestion rapide pour savoir où mettre les choses.

  • ~/.bashrc (Gets évalué en toute occasion (à condition de suivre la recommandation)

    Pour évaluation rapide et le code pour votre réservé aux utilisateurs y Bash-only utilisation de la ligne de commande (alias pour exemple). bashisme sont les bienvenus.

    Il se charge tout seul après :

    • créer une nouvelle fenêtre/volet Shell dans les sessions graphiques.
    • en appelant bash
    • screen un nouveau volet ou un nouvel onglet. (pas tmux !)
    • toute instance de bash dans un client de console graphique ( terminator / gnome-terminal ...) si vous ne pas cocher option "exécuter la commande comme login Shell".

    Et il sera chargé dans toutes les autres occasions grâce à la recommandation préalable.

  • ~/.bash_profile (Gets évalué dans une occasion spécifique seulement )

    Pour évaluation lente et le code pour votre réservé aux utilisateurs y console-session processus. bashisme sont les bienvenues. Il est chargé sur :

    • connexion à la console (Ctrl-Alt F1),
    • les connexions ssh sur cette machine,
    • tmux nouveau volet ou Windows (paramètres par défaut), (non screen !)
    • des appels explicites de bash -l ,
    • toute instance de bash dans un client de console graphique ( terminator / gnome-terminal ...) seulement si tu tiques l'option "exécuter la commande comme login Shell".
  • ~/.profil (N'est évalué que dans la session graphique)

    Pour évaluation lente et avec les variables d'environnement non-bachisme pour votre réservé aux utilisateurs et tout session graphique processus. Il est chargé lors de la connexion dans votre interface graphique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X