web-dev-qa-db-fra.com

Pourquoi ~ / .bash_profile n'est pas recherché lors de 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 fait comme suit

  1. Sudo apt-get install openjdk-6-jdk
  2. Ajout des entrées suivantes à ~/.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 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

  1. 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.
  2. Dans ce cas, mon terminal était-il un shell non connecté?
  3. 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?
162
Viriato

~/.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.)

212
geirha

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.

42
lgarzo

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".

25
kisoku

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.

14
Florian Diesch

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:

  • tous les processus sur Linux ont et tilise l'environnement ​​variables
  • les variables d'environnement sont hérité
  • il est donc suffisant de les placer ne fois sur le père de tout votre processus (surtout s'il nécessite du temps de calcul.)
  • le père de tous vos processus est généralement lancé après vous connectez-vous sur votre appareil (donnez vos informations d'identification).
  • il y a des choses que vous ne voudrez peut-être faire qu'une fois lorsque vous vous connecterez à votre ordinateur (recherchez les nouveaux messages, par exemple ...).

Donc, le temps de "connexion" est typiquement:

  • En mode console, lorsque vous vous connectez (avec Ctrl-Alt F1) ou via sshname__, car 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 récit assez commun pour les utilisateurs d'ubuntu. Donc, considérant que:

  • vous utilisez bashShell,
  • vous avez un ~/.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:

    • créer une nouvelle fenêtre/volet Shell dans les sessions graphiques.
    • appelant bashname__
    • screennouveau volet ou onglet. (pas tmuxname__!)
    • toute instance bash dans un client de console graphique (terminatorname __/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:

    • connexion à la console (Ctrl-Alt F1),
    • ssh se connecte à cette machine,
    • tmuxnouveau volet ou fenêtres (paramètres par défaut), (pas screenname__!)
    • appels explicites de bash -l,
    • toute instance bash dans un client de console graphique (terminatorname __/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.

2
vaab