Bash ne charge pas '.profile' dans une nouvelle session sous Linux

22

J'installe une nouvelle machine Linux que j'ai obtenue de notre service informatique, et .profilej'ai remarqué qu'elle n'est pas chargée lorsque je démarre une nouvelle session de terminal. Le shell actuel est Bash , bien que je l'aie changé par rapport au sh par défaut fourni. Comment le charger .profileau démarrage?

J'accéder au shell via SSH : ssh myusername@remotemachine. J'ai des privilèges d'administrateur dessus.

sa125
la source
Montrez-nous la commande que vous utilisez pour démarrer votre shell.
Nifle

Réponses:

24

Lorsque Bash démarre en tant que shell de connexion interactif, l'un des fichiers qu'il peut traiter est ~/.profile.

Lorsqu'il démarre en tant que shell interactif sans connexion, il ne le fait pas. Il traite /etc/bash.bashrc(si ce fichier ou un fichier similaire est activé dans votre version de Bash) et ~/.bashrc.

Vous pouvez ajouter ce qui suit à votre ~/.bashrc(mais faites attention aux boucles ou aux valeurs modifiées par inadvertance):

. $HOME/.profile
En pause jusqu'à nouvel ordre.
la source
8
Si vous voulez que votre source .bashrc votre .profile (que je ne recommande pas), vous devriez avoir une certaine protection contre le double approvisionnement. Définissez une variable de garde ou plus [ -z "$SOME_VAR_SET_IN_PROFILE" ] && . ~/.profile
Rich Homolka
2
Ouais, je ne le recommande pas vraiment non plus.
pause jusqu'à nouvel ordre.
12
Un shell de connexion essaiera ~ / .bash_profile, ~ / .bash_login et ~ / .profile dans l'ordre et n'ouvrira que le premier qu'il trouve.
Beano
3
Comme d'autres l'ont dit, ce n'est PAS recommandé, car la manière habituelle est pour le profil et les "amis" (.bash_profile) de source .bashrc, et non l'inverse. Il se peut que votre programme terminal ne soit PAS un shell de connexion, mais un shell interactif sans connexion. Il y a souvent une préférence que vous pouvez définir - faites-en un shell de connexion pour exécuter .profile, .login et / ou .bash_profile.
rholmes
15

Cela dépend de la façon dont vous démarrez votre shell. Comme d'autres l'ont dit, un shell de connexion chargera votre profil (il recherchera d'abord .bash_profile, puis essaiera .profile). S'il en trouve un, il les charge. Un shell sans connexion (interactif ou non interactif) générera .bashrc.

Je suggère de tout mettre dans .bashrc. La division .profile / .bashrc était un peu arbitraire et avait plus de sens dans les vieux jours d'UNIX quand tty n'était pas seulement un nom de périphérique et signifiait un TeleType réel. Il était destiné à démarrer certaines choses (comme vérifier le courrier) sur la connexion `` principale '' à un serveur, et juste des trucs de configuration normaux pour d'autres shells. Dans la plupart des Linux, vous vous connecterez maintenant, vous ne vous connectez pas vraiment à un shell, car vous vous connectez à une interface graphique (KDE, gnome, CDE 'shudder'). Le "processus de connexion au spawn" est désormais pris en charge par votre gestionnaire de session. C'est beaucoup moins pertinent maintenant.

Ma suggestion: faites en sorte que votre profil soit composé uniquement de:

[ -f $HOME/.bashrc ] && . $HOME/.bashrc

en tant que première ligne de .bashrc, évitez les choses étranges qui se produisent lors de l'exécution d'un script bash en sautant tôt:

[[ $- != *i* ]] && return
Rich Homolka
la source
5
.profiledevrait être maintenu agnostique bash. Je suggère de configurer .bash_profilepour charger .profilepuis charger .bashrc. ne mettre que des trucs agnostiques bash .profile, comme PATHet les LC_*trucs. Mettez le reste .bashrc.
lesmana
@Rich Homolka Pourquoi [-f $ HOME / .bashrc] est deux fois dans votre commande? En quoi la commande que vous avez publiée est-elle différente de simplement '. $ HOME / .bashrc '?
David Doria
1
Protip: Ne mettez rien dans votre .bashrc qui écrit sur stdout ou stderr, car cela peut casser des clients non interactifs pour des choses comme SCP. Les choses avec une sortie (par exemple, j'aime être accueilli avec un cookie de fortune et un temps de disponibilité) ne devraient aller que dans .profile / .bash_profile
Brian A. Henning
@Lotharyx true. Nous avons eu un kshrc standard qui a exporté vers stdout, a éclaté Xserver (dépassement du colibri)
Rich Homolka