Configurez gnome-terminal pour démarrer bash en tant que shell de connexion, ne lit pas .bashrc

24

J'essaie d' intégrer RVM avec gnome-terminal .

Par défaut, gnome-terminal ne démarre pas bash en tant que shell de connexion. J'ai activé run command as a login shellcomme suggéré dans cette réponse sur le même sujet la configuration de RVM, mais lorsque je le fais, le .bashrcfichier n'est pas lu.

Par exemple, je crée une variable d'environnement dans .bashrcet puis quand je démarre un nouveau gnome-terminal, je ne peux pas la lire. Je dois exécuter explicitement source .bashrcpour lire le fichier.

Est-ce le comportement attendu?

Arturo Herrero
la source

Réponses:

38

Oui, 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

Lisez le manuel bash sur les fichiers de démarrage pour plus de détails.

Personnellement, je pense que ce comportement est étrange et je n'ai pas encore trouvé de rationalisation pour cette décision de conception.


Quelques explications sur la terminologie:

  • Un shell interactif est un shell avec lequel vous pouvez interagir, ce qui signifie que vous pouvez y saisir des commandes. La plupart des shells que vous utiliserez sont des shells interactifs.
  • Un shell non interactif est un shell avec lequel vous ne pouvez pas interagir. Les scripts shell s'exécutent dans des shells non interactifs.
  • Un shell de connexion est le shell qui démarre lorsque vous vous connectez à votre système.
  • Un shell sans connexion est un shell qui démarre après le processus de connexion.

La plupart des shells que vous voyez sont des shells interactifs sans connexion . Cela est particulièrement vrai si vous utilisez un environnement graphique comme gnome, car alors gnome est le "shell de connexion". Toute session bash démarrée dans gnome est un shell sans connexion. Si vous souhaitez voir un véritable shell de connexion interactif, accédez à une console virtuelle (en utilisant Ctrl+Alt+F1), puis connectez-vous en utilisant votre nom d'utilisateur et votre mot de passe. C'est un véritable shell bash de connexion interactive. Vous pouvez revenir au shell graphique en utilisant Ctrl+Alt+F7.

Il existe une option --loginqui fera en sorte que bash se comporte comme s'il s'agissait d'un shell de connexion même s'il était démarré après votre connexion. Configurer gnome-terminal pour démarrer bash en tant que shell de connexion signifie qu'il démarrera bash en utilisant l' --loginoption.


Habituellement, vous voulez que bash lise toujours ~/.bashrcdans un shell interactif. Voici comment je recommande de le faire:

Créez un ~/.bash_profilefichier. Si bash est démarré en tant que shell de connexion, il recherchera d'abord ~/.bash_profileavant de chercher ~/.profile. Si bash le trouve, ~/.bash_profileil ne lira pas ~/.profile.

Mettez les lignes suivantes ~/.bash_profile:

[ -f "$HOME/.profile" ] && source "$HOME/.profile"
[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"

Maintenant, si bash est démarré en tant que shell de connexion interactif, il lira les fichiers suivants:

  1. ~/.bash_profile
  2. ~/.profile
  3. ~/.bashrc

et si bash est démarré comme un shell interactif sans connexion:

  1. ~/.bashrc

Vous devriez mettre des choses qui sont spécifiques à bash ~/.bashrcet des choses qui ne sont pas spécifiques à bash ~/.profile. Par exemple PATHentre ~/.profileet HISTCONTROLentre ~/.bashrc.

Notez que ce ~/.profilen'est pas spécifique à bash. D'autres shells basés sur du texte (par exemple sh ou ksh) et des shells graphiques (gnome) lisent également ~/.profile. C'est pourquoi vous ne devriez pas mettre de choses spécifiques à bash ~/.profile.

lesmana
la source
1
+1. Merci, cela me faisait monter le mur ... :-)
richsage
1
mywiki.wooledge.org/DotFiles explique un peu pourquoi il en est ainsi. La principale raison de ce problème avec rvm est que rvm place le code, qui est censé être en ~/.bashrcpremier lieu, dans le profil à la place. Le défaut est sur rvm.
geirha
Selon @geirha, ils auraient dû utiliser~/.profile
sanmai
La justification est que le script de profil peut contrôler l'évaluation de .bashrcce qu'il doit faire. Si le shell interactif .bashrcdoit toujours lire, cela devrait-il être avant ou après .profile? Et si vous voulez mettre en place des choses .bashrcqui tiennent .profilepour acquis? Et en même temps, vous voulez que certaines choses .bashrcdépendent de quelque chose mis en place par .profile? Aucun ordre de chargement ne satisfera les deux scénarios.
Kaz
11

Ce n'est ni une mauvaise décision de conception, ni un bug, ni un comportement attendu des shells et des terminaux

C'est simplement une valeur par défaut malheureuse d'une option de configuration par profil dans Gnome Terminal, que vous pouvez facilement corriger.

  1. Allez dans Edition -> Préférences de profil .

  2. Sélectionnez l' onglet Titre et commande .

  3. Remarquez comment la case Exécuter la commande en tant que shell de connexion n'est pas cochée! Vérifie ça.

C'est ça. Si vous effectuez cette opération sur le Defaultprofil ou sur le profil configuré pour être utilisé lors de la création de nouveaux terminaux, vous obtenez un shell de connexion.

Je suppose que sous le capot, cette option la fait probablement passer l' -loption au shell.

Client
la source
0

J'avais la même question et j'ai trouvé une solution: utilisez simplement SSH pour un véritable shell de connexion!

1. En tant que superutilisateur, créez un utilisateur système rvm dédié pour une isolation complète et attribuez un mot de passe:

sudo su

useradd -m rvmuser

passwd rvmuser

2. Installez les dépendances pour que rvm puisse créer des rubis sans demander le mot de passe du superutilisateur:

apt-get install curl gawk libreadline6-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake bison libffi-dev

3. SSH dans localhost pour un vrai shell de connexion (vous devrez peut-être apt-get install ssh)

ssh rvmuser@localhost

4. Installez rvm

\curl -sSL https://get.rvm.io | bash -s stable

5. Déconnectez-vous et reconnectez-vous pour que toutes les fonctions rvm soient chargées

exit

ssh rvmuser@localhost

6. Utilisez rvm :)

Michael Franzl
la source
0

Il est courant lorsque vous utilisez bash pour placer l'initialisation du profil .bash_profile, qui est en lecture seule par bash lors de la connexion, tandis que d'autres shells ont historiquement partagé .profile. Cela vous permet de placer des commandes spécifiques à bash dans .bash_profile.

L'utilisation des éléments suivants est généralement effectuée pour extraire les alias définis dans .bashrc:

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
Rob Prentice
la source