GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le ~/.bash_profile ne fonctionne-t-il pas ?

J'utilise Linux Mint. Mon shell de connexion (cat /etc/passwd | grep myUserName ) est bash.

Après avoir démarré mon environnement de bureau graphique et exécuté un émulateur de terminal à partir de celui-ci, je peux voir que .bash_profile n'est pas sourcée (vars d'environnement qui sont export ed in it are unset). Mais si je me connecte depuis une console texte (ctrl +alt +F1 ) ou exécutez manuellement bash -l depuis l'émulateur de terminal, .bash_profile fonctionne bien.

Ai-je tort quand je pense que .bash_profile doit être sourcé au démarrage de X et tous les export 'ed vars devrait être disponible dans le terminal, exécuté à partir de X ?

PS Tout placer dans .bashrc et le sourcer à partir de .bash_profile n'est pas une bonne idée (https://stackoverflow.com/questions/902946/) :les éléments d'environnement ne doivent être sourcés qu'une seule fois.

Réponse acceptée :

Le fichier ~/.bash_profile est lu par bash lorsqu'il s'agit d'un shell de connexion. C'est ce que vous obtenez lorsque vous vous connectez en mode texte.

Lorsque vous vous connectez sous X, les scripts de démarrage sont exécutés par /bin/sh . Sur Ubuntu et Mint, /bin/sh est dash, pas bash. Dash et bash ont tous les deux les mêmes fonctionnalités de base, mais dash s'en tient à ces fonctionnalités de base afin d'être rapide et petit, tandis que bash ajoute de nombreuses fonctionnalités au prix de davantage de ressources. Il est courant d'utiliser dash pour les scripts qui n'ont pas besoin des fonctionnalités supplémentaires et bash pour une utilisation interactive (bien que zsh ait beaucoup de fonctionnalités plus intéressantes).

La plupart des combinaisons de gestionnaire d'affichage (le programme dans lequel vous tapez votre nom d'utilisateur et votre mot de passe) et d'environnement de bureau lisent ~/.profile à partir des scripts de connexion dans /etc/X11/Xsession , /usr/bin/lightdm-session , /etc/gdm/Xsession ou selon le cas. Mettez donc vos définitions de variable d'environnement dans ~/.profile . Assurez-vous de n'utiliser que la syntaxe prise en charge par le tiret.

Alors, que mettre où ?

  • Un bon .bash_profile charge .profile , et charge .bashrc si le shell est interactif.

    . ~/.profile
    if [[ $- == *i* ]]; then . ~/.bashrc; fi
    
  • Dans .profile , mettre des définitions de variables d'environnement et d'autres paramètres de session tels que ulimit .

  • Dans .bashrc , placez les paramètres interactifs bash tels que les alias, les fonctions, la complétion, les raccourcis clavier (qui ne sont pas dans .inputrc ), …
En relation :Debian 9 :Après la mise à jour depuis la 8, MySQL (MariaDB) ne fonctionne plus ?
Linux
  1. Personnalisation du shell Bash

  2. Pourquoi l'expression régulière fonctionne-t-elle dans X mais pas dans Y ?

  3. Pourquoi le PC ne lit-il pas les DVD ? ?

  4. Pourquoi Bash `(())` ne fonctionne-t-il pas dans `[[]]` ?

  5. Pourquoi le bit setuid fonctionne-t-il de manière incohérente ?

.bashrc contre .bash_profile

Pourquoi Lsdel dans Debugfs ne fonctionne pas ?

Pourquoi le script Bash ne se ferme-t-il pas après l'exécution ?

Pourquoi "zip" dans une boucle For fonctionne-t-il lorsque le fichier existe, mais pas lorsqu'il n'existe pas ?

Pourquoi le parent Shell Here-document ne fonctionne pas pour la sous-commande dans Dash mais Bash fonctionne?

Pourquoi Cryptkeeper ne fonctionne-t-il pas dans la version 12.04 ?