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?
Oui, c'est le comportement attendu.
Le comportement, en bref, est le suivant:
~/.profile
~/.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:
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:
~/.bash_profile
~/.profile
~/.bashrc
et si bash est démarré en tant que shell interactif sans connexion:
~/.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
.
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.
Allez à Éditer -> Préférences de profil.
Sélectionnez l'onglet Titre et Commande.
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.
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
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.
exit
name__
ssh rvmuser@localhost
6. Utilisez RVM :)