web-dev-qa-db-fra.com

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

J'essaie de 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 Shell comme suggéré dans cette réponse à propos du même sujet que la configuration de RVM, mais lorsque je le fais, le fichier .bashrc n'est pas lu.

Par exemple, je crée une variable d'environnement dans .bashrc, puis lorsque je démarre un nouveau terminal gnome, je ne peux pas le lire. J'ai besoin d'exécuter explicitement source .bashrc pour lire le fichier.

Est-ce le comportement attendu?

23
Arturo Herrero

Oui, c'est le comportement attendu.

Le comportement, en bref, est le suivant:

  • bash a démarré en tant que login interactif Shell: lit ~/.profile
  • bash a démarré en tant que 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 justification 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 entrer des commandes. La plupart des coquillages que vous utiliserez sont des coquillages interactifs.
  • Un shell non interactif est un shell avec lequel vous ne pouvez pas interagir. Les scripts de shell s'exécutent dans des shells non interactifs.
  • Un shell de connexion est le shell qui est lancé lorsque vous vous connectez à votre système.
  • Un shell non connecté est un shell qui est démarré 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 gnome est le "shell de connexion". Toute session bash démarrée dans gnome est un shell sans connexion. Si vous voulez voir un shell de connexion interactif, accédez à une console virtuelle (à l'aide de Ctrl+Alt+F1), puis connectez-vous à l'aide de votre nom d'utilisateur et de votre mot de passe. C'est un vrai shell de connexion interactive. Vous pouvez revenir au shell graphique en utilisant Ctrl+Alt+F7.

Il existe une option --login qui permet à bash de se comporter comme s'il s'agissait d'un shell de connexion même après avoir ouvert votre session. Configurer gnome-terminal pour qu'il démarre bash en tant que login Le shell signifie qu'il démarrera bash avec l'option --login.


Généralement, vous voulez que bash lise toujours ~/.bashrc dans un shell interactif. Voici comment je recommande de faire cela:

Créez un fichier ~/.bash_profile. Si bash est démarré en tant que shell de connexion, il recherchera d'abord ~/.bash_profile avant de rechercher ~/.profile. Si bash trouve ~/.bash_profile, il ne lira pas ~/.profile.

Mettez les lignes suivantes dans ~/.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é en tant que shell interactif sans connexion:

  1. ~/.bashrc

Vous devriez mettre des éléments qui sont spécifiques à bash dans ~/.bashrc et des éléments qui ne sont pas spécifiques à bash dans ~/.profile. Par exemple, PATH va dans ~/.profile et HISTCONTROL va dans ~/.bashrc.

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

37
lesmana

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

Il s’agit simplement d’une fausse valeur par défaut d’une option de configuration par profil dans Gnome Terminal, que vous pouvez facilement corriger.

  1. Allez à Éditer -> Préférences de profil.

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

  3. Notez que la case Exécuter la commande en tant que login Shell est décochée! Vérifie ça.

C'est tout. Si vous faites cela avec le profil Default ou avec le profil configuré pour être utilisé lors de la création de nouveaux terminaux, vous obtenez un shell de connexion.

J'imagine que sous le capot, cette option le fait probablement passer l'option -l au shell.

9
Guest

Il est courant lors de l'utilisation de bash de placer l'initialisation du profil dans .bash_profile, qui est lu uniquement par bash lors de la connexion, alors que d'autres shells ont historiquement partagé .profile. Cela vous permet de placer des commandes spécifiques à bash dans .bash_profile.

Les opérations suivantes sont couramment utilisées pour extraire les alias définis dans .bashrc:

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

J'avais la même question et j'ai trouvé une solution: utilisez simplement SSH pour créer 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 de sorte que rvm puisse créer des rubis sans demander le mot de passe 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 en localhost pour un shell de connexion réel (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 de RVM soient chargées.

exitname__

ssh rvmuser@localhost

6. Utilisez RVM :)

0
Michael Franzl