web-dev-qa-db-fra.com

Pourquoi mon ~ / .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 d'origine (les variables d'environnement qui sont exported dedans ne sont pas définies). Mais si je me connecte à partir d'une console texte (ctrl+alt+F1) ou exécutez manuellement bash -l depuis l'émulateur de terminal, .bash_profile fonctionne très bien.

Ai-je tort quand je pense que .bash_profile devrait provenir du démarrage de X et toutes les variables export 'ed devraient être disponibles dans le terminal, à partir de X?

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

36
AntonioK

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 tiret , pas bash. Dash et bash ont tous deux les mêmes fonctionnalités de base, mais le tableau de bord s'en tient à ces fonctionnalités de base afin d'être rapide et petit tandis que bash ajoute beaucoup de fonctionnalités au prix de nécessiter plus 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 zsha beaucoup de fonctionnalités plus agréables ).

La plupart des combinaisons du gestionnaire d'affichage (le programme dans lequel vous saisissez votre nom d'utilisateur et votre mot de passe) et l'environnement de bureau indiquent ~/.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 d'environnement dans ~/.profile. Assurez-vous d'utiliser uniquement la syntaxe prise en charge par dash.

Alors, que devez-vous mettre où?

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

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

  • Dans .bashrc, place les paramètres interactifs bash tels que les alias, les fonctions, l'achèvement, 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 .

.bash_profile est le script de configuration de démarrage de bash. Il n'existe pas de norme obligeant X à source .bash_profile.

Ce à quoi vous pensez est plutôt .profile. Il s'agissait à l'origine du fichier de configuration de démarrage du Bourne Shell (sh). Aujourd'hui, de nombreuses distributions ont leur environnement de bureau configuré sur la source .profile. Notez que ce n'est pas non plus une norme, mais cela semble être une convention.

Debian utilisait le source .profile lors de la connexion graphique ( page wiki à partir de 201 ) maintenant ce n'est pas le cas ( page wiki à partir de 2016 ).

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

Ubuntu avait l'habitude de décourager l'utilisation de .profile ( page wiki à partir de 201 ) maintenant cela ne décourage plus ( page wiki à partir de 2016 ).


Concernant votre autre question: pourquoi mon ~/.bash_profile ne fonctionne-t-il pas? C'est le comportement attendu.

En bref, le comportement 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 à une question similaire dans askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-Shell-doesnt -read-bashrc/132319 # 132319

16
lesmana

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

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

Un d. 1)

L'exécuter directement dans le terminal signifie qu'aucun sous-shell ne sera créé. Vous pouvez donc utiliser deux commandes:

source ~/.bash_profile

ou

. ~/.bash_profile

Dans les deux cas, cela mettra à jour l'environnement avec le contenu du fichier .profile.

Annonce 2) Vous pouvez démarrer n'importe quel script bash en appelant

sh myscript.sh 

ou

. myscript.sh

Dans le premier cas, cela créera un sous-shell qui n'affectera pas les variables d'environnement de votre système et elles ne seront visibles que par le processus du sous-shell. Après avoir terminé la commande de sous-shell, aucune des exportations, etc. ne sera appliquée. CECI IS UNE ERREUR COMMUNE ET FAIT BEAUCOUP DE DÉVELOPPEURS POUR PERDRE BEAUCOUP DE TEMPS.

Pour que vos modifications appliquées dans votre script aient un effet sur l'environnement global, le script doit être exécuté avec

.myscript.sh

commander.

Afin de vous assurer que votre script n'est pas exécuté dans un sous-répertoire, vous pouvez utiliser cette fonction. (Encore une fois, l'exemple est pour Ubuntu Shell)

#/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
}

J'espère que cela efface certains des malentendus courants! : D Bonne chance!

3
twboc

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

  • Mettre ma configuration PATH dans un fichier .profile (car j'utilise parfois d'autres shells)
  • Mettre mes alias et fonctions Bash dans mon fichier .bashrc
  • Ensuite, utilisez ce [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 n'a pas fonctionné pour moi sur Linux Mint. En utilisant .bashrc a bien fonctionné.

2
serv-inc

La solution simple consiste à faire du 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". This article explique la différence entre un shell de connexion et un autre qui ne l'est pas.

0