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

Jutilise 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 nest pas source (vars denvironnement qui sont export ne sont pas définis). Mais si je me connecte à partir dune console texte ( ctrl + alt + F1 ) ou que je lance manuellement bash -l depuis lémulateur de terminal, .bash_profile fonctionne bien.

Je me trompe quand je pense que .bash_profile doit être généré au démarrage de X et tous les export « ed vars doivent être disponibles dans le terminal, fonctionnant à partir de X?

PS Placer tout dans .bashrc et lapprovisionner à partir de .bash_profile nest pas une bonne idée ( https://stackoverflow.com/questions/902946/ ): les éléments denvironnement ne doivent être fournis quune seule fois.

Réponse

Le fichier ~/.bash_profile est lu par bash lorsquil sagit dun shell de connexion. Cest 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. Sous Ubuntu et Mint, /bin/sh est dash , pas bash. Dash et bash ont tous deux les mêmes fonctionnalités de base, mais le tiret reste fidèle à ces fonctionnalités de base afin dêtre rapide et petit alors que bash ajoute beaucoup de fonctionnalités au prix de nécessiter plus de ressources. Il est courant dutiliser dash pour les scripts qui nont pas besoin de fonctionnalités supplémentaires et bash pour une utilisation interactive (bien que zsh a beaucoup de fonctionnalités plus intéressantes ).

La plupart des combinaisons daffichage manager (le programme dans lequel vous saisissez votre nom dutilisateur et votre mot de passe) et lenvironnement 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 variables denvironnement dans ~/.profile. Assurez-vous de nutiliser que la syntaxe prise en charge par le tiret.

Alors, que devez-vous mettre où?

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

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • Dans .profile, placez les définitions de variables denvironnement et dautres paramètres de session tels que ulimit.

  • Dans .bashrc, mettez les paramètres interactifs bash tels que les alias, les fonctions, la complétion, les raccourcis clavier (qui ne sont pas dans .inputrc),…

Voir aussi Différence entre le shell de connexion et le shell sans connexion? et Alternative à .bashrc .

Commentaires

  • beaucoup de choses apprises dune seule réponse: )
  • Même .profile ne ‘ t fonctionne pas dans Debian 10  » Buster « , uniquement .bashrc wor ks

Answer

.bash_profile est le script de configuration de démarrage de frapper. Il nexiste pas de norme obligeant X à se procurer .bash_profile.

Ce à quoi vous pensez est plutôt .profile. À lorigine, cétait le fichier de configuration de démarrage du bourne shell (sh). Aujourdhui, de nombreuses distributions ont leur environnement de bureau configuré sur la source .profile. Notez que ce nest pas non plus une norme, mais cela semble être une convention.

Debian avait lhabitude de trouver .profile lors de la connexion graphique ( page wiki à partir de 2013 ) maintenant ce nest pas le cas ( page wiki à partir de 2016 ).

Arch sources .xprofile à la connexion graphique ( page wiki à partir de 2013 ).

Ubuntu avait lhabitude de décourager lutilisation de .profile ( page wiki à partir de 2013 ) maintenant il ne décourage plus ( page wiki à partir de 2016 ).


Concernant votre autre question: Pourquoi mon ~ / .bash_profile ne fonctionne-t-il pas? comportement attendu.

Le comportement, en bref, est le suivant:

  • bash a commencé comme un shell de connexion interactif: lit ~/.profile
  • bash a commencé comme un shell interactif sans connexion: lit ~/.bashrc

Pour plus de détails, voir ma réponse à un simil Une question dans askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Commentaires

  • Certaines choses sont correctes, mais » toujours lire ~/.bashrc « est un mauvais conseil: vous ne devez lire que .bashrc à partir dun shell interactif .Vous ‘ avez manqué le problème principal ici qui est que lors de la connexion sous X, il ny a pas dinstance de connexion de bash (dans la plupart des combinaisons de gestionnaire daffichage / environnement de bureau, y compris évidemment AntonioK ‘ s).
  • Merci pour vos commentaires. Jespère avoir suffisamment mis à jour ma réponse pour résoudre vos plaintes. En ce qui concerne mon conseil à  » lire toujours .bashrc « , je voulais toujours un shell interactif . Jai clarifié cette partie. Jespère que ce nest plus trompeur.
  •  » Ubuntu déconseille spécifiquement dutiliser .profile ( link )  » Le wiki a une fois (absurdement) découragé cela; que ‘ a été corrigé. (Notez que /etc/profile reste déconseillé pour les affectations à léchelle du système, de préférence pour lajout de scripts à /etc/profile.d.) Par utilisateur sont désormais présentés comme lune des méthodes recommandées pour définir des variables denvironnement par utilisateur:  » Fichiers appropriés pour les paramètres de variables denvironnement qui ne devraient affecter quun utilisateur particulier ( plutôt que le système dans son ensemble) sont ~ / .pam_environment et ~ / .profile .  »
  • La page liée à Debian spécifie que Debian ne pas lit ~/.profile pour la connexion graphique et que ~/.xsessionrc devrait être utilisé à la place.
  • merci davoir remarqué. la page wiki a été mise à jour. Jai lié aux versions telles quelles étaient au moment de la réponse.

Réponse

Quelques problèmes surviennent lorsque essayer de recharger le fichier / source ~ / .profile. [Cela fait référence à Ubuntu Linux – dans certains cas, les détails des commandes seront différents]

  1. Exécutez-vous ceci directement dans un terminal ou dans un script?
  2. Comment faire vous exécutez ceci dans un script?

Annonce. 1)

Lexécuter directement dans le terminal signifie quil ny aura pas de sous-shell créé. Vous pouvez donc utiliser deux commandes:

source ~/.bash_profile 

ou

. ~/.bash_profile 

Dans les deux cas cela mettra à jour lenvironnement avec le contenu du fichier .profile.

Annonce 2) Vous pouvez démarrer nimporte quel script bash soit en appelant

sh myscript.sh 

ou

. myscript.sh 

Dans le premier cas, cela créera un sous-shell qui naffectera pas les variables denvironnement de votre système et ils ne seront visibles que par le processus de sous-shell. Après avoir terminé la commande de sous-shell, aucune des exportations, etc. ne sera appliquée. CECI EST UNE ERREUR COURANTE ET CAUSE BEAUCOUP DE DÉVELOPPEURS À PERDRE BEAUCOUP DE TEMPS.

Pour que vos modifications appliquées à votre script prennent effet pendant lenvironnement global dans lequel le script doit être exécuté avec la commande

.myscript.sh 

.

Afin de vous assurer que votre script nest pas exécuté dans un sous-casque, vous pouvez utiliser cette fonction. (Un autre exemple est pour le shell Ubuntu)

#/bin/bash preventSubshell(){ if [[ $_ != $0 ]] then echo "Script is being sourced" else echo "Script is a subshell - please run the script by invoking . script.sh command"; exit 1; fi } 

Jespère que cela élimine certains des malentendus courants! : D Bonne chance!

Réponse

Dans votre question, vous faites référence à https://stackoverflow.com/questions/902946/ comme recommandant de ne pas rechercher, lorsque la réponse acceptée le prescrit

  • Mettez ma configuration PATH dans un fichier .profile (car jutilise parfois dautres shells)
  • Mettez mes alias et fonctions Bash dans my. fichier bashrc
  • Ensuite, utilisez ceci [EDITED: snip code-comments]:

    .bash_profile:

    #!/bin/bash # echo "Loading ${HOME}/.bash_profile" source ~/.profile # Get the paths source ~/.bashrc # get aliases 

Tout mettre dans .profile a fait ne fonctionne pas pour moi sur Linux Mint. Utiliser .bashrc a bien fonctionné.

Réponse

La solution simple est de faire le terminal un terminal de connexion. Pour le terminal Gnome sous « Tile and Command » du profil par défaut, vous pouvez cocher la case « Run command as a login shell ». Cet article explique la différence entre un shell de connexion et un autre qui ne lest pas.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *