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 --login
qui 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' --login
option.
Habituellement, vous voulez que bash lise toujours ~/.bashrc
dans un shell interactif. Voici comment je recommande de le faire:
Créez un ~/.bash_profile
fichier. Si bash est démarré en tant que shell de connexion, il recherchera d'abord ~/.bash_profile
avant de chercher ~/.profile
. Si bash le trouve, ~/.bash_profile
il 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:
~/.bash_profile
~/.profile
~/.bashrc
et si bash est démarré comme un shell interactif sans connexion:
~/.bashrc
Vous devriez mettre des choses qui sont spécifiques à bash ~/.bashrc
et des choses qui ne sont pas spécifiques à bash ~/.profile
. Par exemple PATH
entre ~/.profile
et HISTCONTROL
entre ~/.bashrc
.
Notez que ce ~/.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) lisent également ~/.profile
. C'est pourquoi vous ne devriez pas mettre de choses spécifiques à bash ~/.profile
.
~/.bashrc
premier lieu, dans le profil à la place. Le défaut est sur rvm.~/.profile
.bashrc
ce qu'il doit faire. Si le shell interactif.bashrc
doit toujours lire, cela devrait-il être avant ou après.profile
? Et si vous voulez mettre en place des choses.bashrc
qui tiennent.profile
pour acquis? Et en même temps, vous voulez que certaines choses.bashrc
dépendent de quelque chose mis en place par.profile
? Aucun ordre de chargement ne satisfera les deux scénarios.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.
Allez dans Edition -> Préférences de profil .
Sélectionnez l' onglet Titre et commande .
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
Default
profil 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'
-l
option au shell.la source
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 :)
la source
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
:la source