Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

.bachrc non lu lors d'une connexion via gnome

20 réponses
Avatar
Francois Lafont
Bonjour à tous,

Je suis sous Ubuntu 10.04 et mon shell est le bash. Dans mon fichier
~/.profile, j'ai ceci :

#--------------
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
#--------------

Autrement dit, je pensais (à tort) que mon ~/.bashrc était
systématiquement «inclus» dans le ~/.profile. Or, ce n'est pas
exactement le cas :

1) Quand je me connecte au système via un terminal, l'inclusion est bien
effectuée car j'ai BASH_VERSION qui est effectivement non vide.

2) Mais quand je me connecte au système via l'interface graphique
(gnome), alors là j'ai pu constater que BASH_VERSION version était vide
et donc que l'inclusion du ~/.bahrc ne se faisait pas.

Je ne comprends pas trop le cas 2), alors que mon shell par défaut est
bien le bash comme en témoigne ceci :

#--------------
$ cat /etc/passwd | grep francois
francois:x:1000:1000:francois,,,:/home/francois:/bin/bash
#--------------

Avez-vous une explication ? Cela me gêne un peu car j'ai des modifs dans
~/.bashrc que j'aimerais bien laisser dans ce fichier et qui du coup ne
prennent pas effet dès que je me connecte via gnome.

Merci d'avance pour votre aide.


--
François Lafont

10 réponses

1 2
Avatar
Doug713705
Le 11/11/2010 20:09 dans fr.comp.os.linux.configuration Francois Lafont
nous expliquait:

2) Mais quand je me connecte au système via l'interface graphique
(gnome), alors là j'ai pu constater que BASH_VERSION version était vide
et donc que l'inclusion du ~/.bahrc ne se faisait pas.

Je ne comprends pas trop le cas 2), alors que mon shell par défaut est
bien le bash comme en témoigne ceci :

#--------------
$ cat /etc/passwd | grep francois
francois:x:1000:1000:francois,,,:/home/francois:/bin/bash
#--------------

Avez-vous une explication ? Cela me gêne un peu car j'ai des modifs dans
~/.bashrc que j'aimerais bien laisser dans ce fichier et qui du coup ne
prennent pas effet dès que je me connecte via gnome.



Je ne sais pas quel émulateur de terminal tu utilises quand tu es dans
une session Gnome et je n'utilise pas Gnome mais j'ai déjà eu un cas
similaire (il me semble que c'était avec Enlightenment).

Pour obtenir le comportement que tu souhaites, il suffisait de
selectionner une option de l'émulateur dont le nom devait ressembler à
"Utiliser un shell de connexion" sans quoi le terminal s'ouvrait mais
ne prenait pas en compte ni les colorations que j'avais définies, ni les
alias de commandes etc...

HTH
--
@+
Doug - Linux user #307925 - Slackware64 roulaize ;-)
Usenet-fr ? Mais qu'est-ce que c'est ? Comment ça marche ?
Pour en savoir plus : http://usenet-fr.dougwise.org/
Avatar
Francois Lafont
Bonsoir,

Le 12/11/2010 21:37, Doug713705 a écrit :

Je ne sais pas quel émulateur de terminal tu utilises quand tu es dans
une session Gnome et je n'utilise pas Gnome mais j'ai déjà eu un cas
similaire (il me semble que c'était avec Enlightenment).

Pour obtenir le comportement que tu souhaites, il suffisait de
selectionner une option de l'émulateur dont le nom devait ressembler à
"Utiliser un shell de connexion" sans quoi le terminal s'ouvrait mais
ne prenait pas en compte ni les colorations que j'avais définies, ni les
alias de commandes etc...



Merci bien pour la réponse.

Dans le terminal de Gnome, j'ai effectivement une option du genre
"Utiliser un shell de connexion", mais ça ne résout pas le problème.
Ceci étant, je ne crois pas que le problème se situe à ce niveau là. Je
crois que je n'ai pas été très clair dans mon premier message. Je vais
tenter à nouveau une explication, plus précise.



Dans le fichier /home/francois/.profile j'ai ça :

#--------------
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
#--------------

Supposons que dans ce même fichier, j'y rajoute à la fin la ligne suivante :

echo $BASH_VERSION >> /home/francois/Bureau/out.txt

Ceci étant déjà fait, j'allume mon PC ce qui démarre Ubuntu (10.04). Une
fois le démarrage terminé, je me retrouve devant une interface graphique
qui me propose d'ouvrir une session avec tel ou tel compte (je crois que
le programme qui lance cette interface s'appelle gdm). Je peux alors
ouvrir une session de deux façons :

1) Soit en ouvrant une session via l'interface graphique de manière très
classique (je clique sur le compte "francois" et je tape le mot de
passe) et là visiblement le fichier .bashrc n'est pas lu et c'est ce qui
me pose problème. En effet, lors de l'ouverture de session, j'ai bien le
fichier out.txt qui est créé sur mon Bureau mais il contient une ligne
vide. Donc la variable BASH_VERSION est vide (j'ignore pourquoi) et le
.bashrc n'est donc pas lu par mon shell de connexion (c'est là mon
problème).

2) Soit en faisant un CTRL-ALT-F1 et en ouvrant une session en ligne de
commande sur le terminal tty1 et là le fichier out.txt est bien créé
(s'il n'existe pas encore) ou bien une ligne y est ajoutée et cette
ligne est "4.1.5(1)-release". Là, BASH_VERSION est donc non vide et le
.bashrc est bien «chargé».

Le cas 1) me pose problème. Je ne comprends pas, alors que mon shell par
défaut est le bash, que dans le cas 1) je puisse avoir BASH_VERSION vide
(et donc que le .bashrc ne soit pas «chargé»)


--
François Lafont
Avatar
Benoit Izac
Bonjour,

le 13/11/2010 à 00:45, Francois Lafont a écrit dans le message
<4cddd1b1$0$3421$ :

Dans le fichier /home/francois/.profile j'ai ça :

#--------------
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
#--------------

Supposons que dans ce même fichier, j'y rajoute à la fin la ligne suivante :

echo $BASH_VERSION >> /home/francois/Bureau/out.txt

Ceci étant déjà fait, j'allume mon PC ce qui démarre Ubuntu (10.04). Une
fois le démarrage terminé, je me retrouve devant une interface graphique
qui me propose d'ouvrir une session avec tel ou tel compte (je crois que
le programme qui lance cette interface s'appelle gdm). Je peux alors
ouvrir une session de deux façons :

1) Soit en ouvrant une session via l'interface graphique de manière très
classique (je clique sur le compte "francois" et je tape le mot de
passe) et là visiblement le fichier .bashrc n'est pas lu et c'est ce qui
me pose problème. En effet, lors de l'ouverture de session, j'ai bien le
fichier out.txt qui est créé sur mon Bureau mais il contient une ligne
vide. Donc la variable BASH_VERSION est vide (j'ignore pourquoi) et le
.bashrc n'est donc pas lu par mon shell de connexion (c'est là mon
problème).



Ouvrir une session est différent que d'ouvrir une console ou un terminal
qui lance ton shell de login. Essaye avec
echo "$0 ($-) $@" >> /home/francois/Bureau/out.txt

2) Soit en faisant un CTRL-ALT-F1 et en ouvrant une session en ligne de
commande sur le terminal tty1 et là le fichier out.txt est bien créé
(s'il n'existe pas encore) ou bien une ligne y est ajoutée et cette
ligne est "4.1.5(1)-release". Là, BASH_VERSION est donc non vide et le
.bashrc est bien «chargé».

Le cas 1) me pose problème. Je ne comprends pas, alors que mon shell par
défaut est le bash, que dans le cas 1) je puisse avoir BASH_VERSION vide
(et donc que le .bashrc ne soit pas «chargé»)



Je pense, la commande ci-dessus devrait le confirmer, que ce n'est pas
bash qui est invoqué lorsque tu ouvres ta session.

--
Benoit Izac
Avatar
Nicolas George
Francois Lafont , dans le message
<4cdc3f6d$0$18805$, a écrit :
Avez-vous une explication ? Cela me gêne un peu car j'ai des modifs dans
~/.bashrc que j'aimerais bien laisser dans ce fichier et qui du coup ne
prennent pas effet dès que je me connecte via gnome.



bash est complètement illogique dans sa manière de sourcer des fichiers de
configuration. Ça conduit les distributions à faire des conneries sans nom,
comme invoquer bash avec l'option pour lui faire se prendre pour un shell de
login même s'il ne l'est pas, ou avoir des fichiers qui devraient être
indépendants qui se sourcent les uns les autres.

zsh est infiniment plus logique :

- .zshenv et /etc/zsh/zshenv sont sourcés systématiquement, et servent
normalement pour l'initialisation de l'environnement (PATH, umask, etc.) ;

- .zprofile et /etc/zsh/zprofile sont sourcés pour tous les shells de
login ;

- .zshrc et /etc/zsh/zshrc sont sourcés pour tous les shells interactifs, et
servent normalement pour la définition d'options d'interface (raccourcis
claviers, options de complétion, alias, etc.).
Avatar
Francois Lafont
Le 13/11/2010 10:00, Nicolas George a écrit :

zsh est infiniment plus logique :

- .zshenv et /etc/zsh/zshenv sont sourcés systématiquement, et servent
normalement pour l'initialisation de l'environnement (PATH, umask, etc.) ;

- .zprofile et /etc/zsh/zprofile sont sourcés pour tous les shells de
login ;

- .zshrc et /etc/zsh/zshrc sont sourcés pour tous les shells interactifs, et
servent normalement pour la définition d'options d'interface (raccourcis
claviers, options de complétion, alias, etc.).




Ok, mais finalement c'est quoi exactement un "shell de login" ?

*) Quelle est la différence entre le "shell de login" et le "shell par
défaut" (celui qu'on voit dans /etc/password) ?

*) Par exemple, comment (où) puis-je savoir qui est mon shell de login ?
Par exemple, quand j'ouvre une session graphiquement, il semblerait que
mon shell de login soit sh, mais quand je me logue via tty1, je suis
sous le shell bash.


--
François Lafont
Avatar
Benoit Izac
Bonjour,

le 13/11/2010 à 14:49, Francois Lafont a écrit dans le message
<4cde974f$0$4288$ :

Au passage, y a-t-il une commande qui peut me donner le shell courant ?
Au départ, je pensais que "echo $0" marchait, mais en fait cela
fonctionne uniquement dans un shell interactif. Par exemple, si je suis
sous le shell bash et que j'ai le script exécutable toto qui contient ceci :

#---------
#! /bin/sh
echo $0
#---------

Alors dans le bash, j'ai ça :

#----------------------
$ echo $0 # je suis bien dans le bash
bash

$ ./toto
./toto

$ sh toto
toto
#----------------------



C'est le comportement normal :
<http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_05_02>
| 0
| (Zero.) Expands to the name of the shell or shell script. See sh
| for a detailed description of how this name is derived.

Existe-t-il une commande qui m'indiquera que, lors de l'appel du script
toto, c'est bien le shell 'sh' qui est utilisé ?



Pas à ma connaissance. Tu peux faire un truc du genre :
$ cat test
#!/bin/sh
echo "$0 ($-) $@"
ps -Ao "pid,args" | awk "/^ *$$/"'{print $2}'
$ ./test a b cd
./test (hB) a b cd
/bin/sh
$ bash ./test a b cd
./test (hB) a b cd
bash
$ sh -ve test a b cd
#!/bin/sh
echo "$0 ($-) $@"
test (ehvB) a b cd
ps -Ao "pid,args" | awk "/^ *$$/"'{print $2}'
sh

--
Benoit Izac
Avatar
Benoit Izac
Bonjour,

le 13/11/2010 à 14:49, Francois Lafont a écrit dans le message
<4cde974f$0$4288$ :

Et oui, bien vu. si j'ai bien tout compris c'est le shell 'sh' qui est
utilisé et donc la non inclusion du .bashrc s'explique alors. Du coup,
pour que mes modifs dans .bashrc soient lues directement après
l'ouverture d'une session graphique, il faut que je me débrouille pour
que ce soit le bash par gdm qui soit utilisé et non le sh. Mais là, je
crois que je vais m'abstenir de tripatouiller ces choses au risque de
tout casser.



J'ai oublié de répondre sur ce point ; le plus simple c'est de
modifier/créer ~/.xsession pour y mettre :

#!/bin/bash
. ~/.bashrc
exec gnome-session

--
Benoit Izac
Avatar
Nicolas George
Francois Lafont , dans le message
<4cde99c0$0$4038$, a écrit :
Ok, mais finalement c'est quoi exactement un "shell de login" ?



C'est un shell lancé pour l'établissement d'une session texte sur la
machine, que ce soit en local (mgetty+login) ou par connexion à distance
(ssh).

*) Quelle est la différence entre le "shell de login" et le "shell par
défaut" (celui qu'on voit dans /etc/password) ?



J'employais le terme shell de login pour désigner le processus. Le même
terme peut être employé pour désigner l'option de /etc/passwd. La
correspondance est que c'est le shell désigné par /etc/passwd qui est lancé
comme shell de login.

Par exemple, quand j'ouvre une session graphiquement



Quand tu ouvres une session graphiquement, aucun shell de login n'est
invoqué. La variable $SHELL est probablement initialisée à la valeur
indiquée dans /etc/passwd, et divers programmes graphiques peuvent ensuite
faire usage de la valeur de $SHELL ou de la valeur dans /etc/passwd, mais
c'est totalement à la discrétion de ces programmes.
Avatar
Francois Lafont
Le 13/11/2010 19:24, Nicolas George a écrit :

Ok, mais finalement c'est quoi exactement un "shell de login" ?



C'est un shell lancé pour l'établissement d'une session texte sur la
machine, que ce soit en local (mgetty+login) ou par connexion à distance
(ssh).



Ok.

*) Quelle est la différence entre le "shell de login" et le "shell par
défaut" (celui qu'on voit dans /etc/password) ?



J'employais le terme shell de login pour désigner le processus. Le même
terme peut être employé pour désigner l'option de /etc/passwd. La
correspondance est que c'est le shell désigné par /etc/passwd qui est lancé
comme shell de login.



Heu, je ne suis pas sûr d'avoir compris la réponse. Je crois comprendre
que "shell de login" est synonyme de "shell par défaut", mais je ne suis
pas sûr.

Par exemple, quand j'ouvre une session graphiquement



Quand tu ouvres une session graphiquement, aucun shell de login n'est
invoqué.



Ah et bien je ne savais pas. Je pensais que, lors de l'ouverture d'une
session graphique, mon shell par défaut était lancé et que c'était lui
qui lançait tout le bazar qui fait que j'ai mon environnement de Bureau
sous les yeux.

La variable $SHELL est probablement initialisée à la valeur
indiquée dans /etc/passwd, et divers programmes graphiques peuvent ensuite
faire usage de la valeur de $SHELL ou de la valeur dans /etc/passwd, mais
c'est totalement à la discrétion de ces programmes.



Mais ces fameux programmes (gdm dans mon cas), il faut bien qu'ils
soient lancés par un shell, non ? J'ai du mal à comprendre comment des
programmes puissent être exécutés sans qu'il y ait un shell au départ
responsable de cette exécution.


--
François Lafont
Avatar
Nicolas George
Francois Lafont , dans le message
<4cdf2120$0$7775$, a écrit :
Heu, je ne suis pas sûr d'avoir compris la réponse. Je crois comprendre
que "shell de login" est synonyme de "shell par défaut", mais je ne suis
pas sûr.



« Shell par défaut », ça n'existe pas en vocabulaire Unix.

J'ai du mal à comprendre comment des
programmes puissent être exécutés sans qu'il y ait un shell au départ
responsable de cette exécution.



Un programme peut toujours être invoqué par l'appel direct de la fonction
système de bas niveau. Utiliser un shell n'est qu'une commodité, pour
pouvoir utiliser des notations un peu plus compactes et versatiles, comme le
développement de variables d'environnement.
1 2