Pourquoi ~ / .bash_profile n'est pas généré lors de l'ouverture d'un terminal?

138

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’avaient jamais eu lieu.

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

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. Dans ce cas, mon terminal était-il un shell non connecté ?
  3. Si oui, pourquoi quand su après le terminal et en mettant le mot de passe, il n’a pas exécuté de profil où j’avais aussi défini les exportations mentionnées ci-dessus?
posée Viriato 11.04.2012 - 18:27
la source

5 réponses

182

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

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

Lorsque vous ouvrez un terminal, le terminal démarre en mode interactif bash (non connecté), ce qui signifie qu’il utilisera ~/.bashrc .

Le bon endroit pour placer ces variables d’environnement est dans ~/.profile , et l’effet devrait être apparent lors de votre prochaine connexion.

Trouver la solution ~/.bash_profile from ~/.bashrc est la mauvaise solution. C'est censé être l'inverse. ~/.bash_profile devrait générer ~/.bashrc .

Voir DotFiles pour une explication plus complète, y compris un historique des raisons pour lesquelles il est comme ça.

(Sur une note parallèle, lors de l’installation d’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 de modifier PATH )

    
réponse donnée geirha 11.04.2012 - 18:41
la source
40

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’utilisez pas de shell de connexion.

Lisez la section invocation du manuel Bash sur la manière 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 en tant que   shell non interactif avec l'option --login , il lit d'abord   et exécute les commandes à partir du fichier /etc/profile , si ce fichier   existe Après avoir lu ce fichier, il recherche ~/.bash_profile ,    ~/.bash_login et ~/.profile , dans cet ordre, et lit et   exécute les commandes du premier qui existe et est lisible.

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

    
réponse donnée lgarzo 11.04.2012 - 18:59
la source
22

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 (c.-à-d. bash -l) en modifiant les préférences de profil.

allez dans Edit - & gt; Préférences de profil - & gt; Onglet Titre et commande cochez l'option "Exécuter la commande en tant que shell de connexion"

    
réponse donnée kisoku 22.06.2013 - 02:23
la source
12

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 qu'il exécute 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 généralement préférable de mettre toutes vos données dans ~/.bashrc .

    
réponse donnée Florian Diesch 11.04.2012 - 18:43
la source
1

TL; DR

Dans la configuration ubuntu classique recommandée, ~/.bash_profile est évalué uniquement dans des occasions spécifiques. Et c'est logique.

Mettez vos fichiers dans ~/.bashrc , ils seront évalués à 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 utilisent l’environnement les variables
  • Les variables d'environnement
  • sont héritées
  • les placer 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 Connectez-vous à votre appareil (indiquez vos identifiants).
  • il y a des choses que vous voudrez peut-être faire une seule fois lorsque vous vous connectez votre ordinateur (vérifiez le nouveau courrier par exemple ...).

Le temps de connexion est donc généralement le suivant:

  • 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 l'ubuntu classique) sera chargé de lire les pages .profile .

Ok, alors où mettre mes affaires?

C'est plutôt complexe, le article complet est ici . Mais voici un résumé c'est assez courant pour les utilisateurs d'ubuntu. Donc, vu que:

  • vous utilisez bash shell,
  • vous avez un ~/.bash_profile et suivez la 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 le mécanisme .

Ceci est une suggestion rapide de savoir où mettre les choses.

  • ~ / .bashrc (obtient évalué en toute occasion , à condition de suivre les recommandations)

    Variable d’environnement et code évaluation rapide pour votre Utilisation de la ligne de commande utilisateur uniquement et bash uniquement (alias pour exemple). Bashism sont les bienvenus.

    Il se charge sur:

    • créer une nouvelle fenêtre / fenêtre shell dans les sessions graphiques.
    • appeler bash
    • screen nouveau volet ou onglet. (pas tmux !)
    • toute instance de bash dans un client de console graphique ( terminator / gnome-terminal ...) si vous ne cochez pas option "exécuter la commande en tant que shell de connexion".

    Et il sera chargé dans l’autre occasion grâce à la recommandation précédente.

  • ~ / .bash_profile (Obtient évalué uniquement pour une occasion spécifique )

    Variable d’environnement et code évaluation lente pour vos processus utilisateur uniquement et session console . bashism sont les bienvenus. Il est chargé 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 (n'est évalué que dans les sessions graphiques)

    Pour les variables d’environnement évaluation lente et avec no-bashism pour vos processus utilisateur et tous les processus session graphique . Il obtient chargé lors de la connexion dans votre interface graphique.

réponse donnée vaab 08.03.2018 - 04:58
la source

Lire d'autres questions sur les étiquettes