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 export
ed 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.
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
.
.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:
~/.profile
~/.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
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]
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!
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é.
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.