Question Pourquoi ~ / .bash_profile n'est pas généré 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. Enregistrer les modifications et quitter

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

Des 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 avant bashrc.
  2. Était dans ce cas mon terminal a non-login coquille?
  3. Si c'est le cas, pourquoi ne pas avoir exécuté le profil avec le mot de passe su après le terminal et avoir défini les exportations mentionnées ci-dessus?

138
2018-04-11 16:27


origine


Belle solution. Je viens de résoudre mon problème! - Atlas7


Réponses:


~/.bash_profile ne provient que de bash au démarrage en mode de connexion interactive. C'est généralement seulement lorsque vous vous connectez à la console (Ctrl+Alt+F1..F6), ou connexion via ssh.

Lorsque vous vous connectez graphiquement, ~/.profile sera créé par le script qui lance gnome-session (ou l’environnement de bureau que vous utilisez). Alors ~/.bash_profile ne provient pas du tout lorsque vous vous connectez graphiquement.

Lorsque vous ouvrez un terminal, le terminal démarre en mode interactif (sans connexion), ce qui signifie qu'il ~/.bashrc.

Le bon endroit pour mettre ces variables d'environnement est dans ~/.profile, et l'effet devrait être apparent la prochaine fois que vous vous connectez.

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

Voir DotFiles pour une explication plus approfondie, y compris une histoire de pourquoi il est comme il est.

(Sur une note de côté, lors de l’installation de openjdk via apt, les liens symboliques devraient être configurés par le paquet, de sorte que vous n’ayez pas vraiment besoin de définir JAVA_HOME ou changer PATH)


183
2018-04-11 16:41



J'ai constaté que lors de l'ouverture d'un terminal à partir de la barre latérale d'Ubuntu 12, le fichier ~ / .profile n'est pas chargé. - jcollum
@jcollum C'est bien. .profile ne devrait provenir que lorsque vous vous connectez - geirha
Oh, ouvrir un terminal n'est pas la même chose que de se connecter ... Je pensais me connecter au terminal. - jcollum
Je sais, c'est pourquoi j'ai ajouté mon code supplémentaire ici. Ce que je voulais faire était de configurer les options pour le terminal (par exemple, l'invite), mais celles-ci n'étaient pas chargées si je les activais. .profile, même après un redémarrage complet. - Juan A. Navarro
@terdon, oui, mais bash n'est pas impliqué lors de la connexion graphique, donc ça va tout droit pour .profile. - geirha


Vous pouvez vérifier si votre shell Bash est démarré 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 le manuel de Bash invocation section sur la façon dont Bash lit (ou ne lit pas) différents fichiers de configuration.

Extrait man bash:

Lorsque bash est appelé en tant que shell de connexion interactif ou   shell non interactif avec le --login  option, il lit d'abord   et exécute des commandes à partir du fichier /etc/profile, si ce fichier   existe Après avoir lu ce fichier, il cherche ~/.bash_profile,    ~/.bash_login, et ~/.profile, dans cet ordre, et lit et   exécute les commandes du premier qui existe et est lisible.

su par contre ne démarre pas non plus un shell de connexion par défaut, vous devez lui dire de le faire en utilisant le --login option.


40
2018-04-11 16:59



Merci beaucoup pour le shotp login_shell commander. Impressionnant!! - Viriato
De rien! Btw. En retour, j'ai beaucoup appris en parcourant la page de manuel de Bash en cherchant votre réponse. :) - lgarzo


Je pense qu'il est utile de mentionner que vous pouvez modifier 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 -> Onglet Titre et commande cochez l'option "Exécuter la commande en tant que shell de connexion"


22
2018-06-22 00:23



Suggestion simple pour résoudre le problème. Exactement ce que je cherchais, merci. - Jose Torres
Quels sont les inconvénients de l'activation de ce paramètre? - chrish
@chris vous chargez simplement du code un peu plus de code que nécessaire dans beaucoup d'occasions. Peu importe si votre ~/.bash_profile évalue très rapidement, 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. - vaab


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. Donc, il lit ~/.bashrc mais non ~/.bash_profile. Tu peux courir su avec le -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.


13
2018-04-11 16:43



C'est ce que j'avais fait et ça a fonctionné, mais vérifiez ce que le gars du bas dit, il suggère que c'est une mauvaise idée de le mettre dans bashrc et de le mettre sur le profil à la place. .... Hey les deux façons de travailler, merci beaucoup. - Viriato


TL; DR

Dans la configuration classique recommandée par 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:

  • tout processus sur Linux ont et utilise l'environnement les variables
  • les variables d'environnement sont hérité
  • les mettant ainsi une fois sur le père de tout votre processus est suffisant (surtout si cela nécessite un temps de calcul)
  • le père de tous vos processus est généralement lancé après vous s'identifier sur votre appareil (donnez vos identifiants).
  • il y a des choses que vous pourriez vouloir faire seulement une fois quand vous vous connectez sur votre ordinateur (vérifiez le nouveau courrier par exemple ...).

Donc, le temps de connexion est généralement:

  • En mode console, lorsque vous vous connectez (avec Ctrl-Alt F1) ou via 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 plutôt complexe, le l'histoire complète est ici. Mais voici un résumé c'est assez courant pour les utilisateurs d'ubuntu. Donc, considérant que:

  • tu utilises bash coquille,
  • tu as un ~/.bash_profile et suivez le recommandation ajouter le chargement de ~/.bashrc dans ton ~/.bash_profile pour obtenir au moins un fichier qui est évalué quelle que soit l'invocation le mécanisme.

Ceci est une suggestion rapide de l'endroit où mettre les choses.

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

    Pour évaluation rapide variable d'environnement et code pour votre réservé aux utilisateurs et bash-only utilisation en ligne de commande (alias pour exemple). bashisme sont les bienvenus.

    Il se charge sur:

    • créer une nouvelle fenêtre / fenêtre shell dans les sessions graphiques.
    • appel bash
    • screen nouveau volet ou onglet. (ne pas tmux !)
    • toute instance de bash dans un client de console graphique (terminator/gnome-terminal...) si tu ne coche pas  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écédente.

  • ~ / .bash_profile  (Obtient évalué à une occasion spécifique seulement)

    Pour évaluation lente variable d'environnement et code pour votre réservé aux utilisateurs et session de console processus. bashisme sont les bienvenus. Il se charge sur:

    • connexion à la console (Ctrl-Alt F1),
    • connexions ssh à cette machine,
    • tmux nouveau volet ou fenêtres (paramètres par défaut), (pas screen !)
    • appels explicites de bash -l,
    • toute instance de bash dans un client de console graphique (terminator/gnome-terminal...) seulement si vous cochez option "exécuter la commande en tant que shell de connexion".
  • ~ / .profile  (Obtient évalué uniquement en session graphique)

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


1
2018-03-08 03:58



Au moment où bash charge un fichier de profil, il se chargera .profile si .bash_profile n'existe pas. - muru