bashrc ou bash_profile?

49

Je connais la différence entre les deux scripts de connexion bash:

.bashrc est exécuté uniquement par des shells "non-login".

.bash_profile(ou .bash_loginou .profile) est exécuté par des coquilles "login".

Quelqu'un a-t-il de bons exemples de choses qui conviennent mieux à une exécution avec un login uniquement, telles que je les mettrais seulement dans .bash_profile, mais elles n'auraient pas vraiment de sens .bashrc?

(Je sais que la plupart d' entre nous SoURce .bashrcsur .bash_profile, donc il ne semble pas y avoir beaucoup d'intérêt à la question en face ...)

Don Faulkner
la source
3
Voir aussi la même question chez Super User .
Gilles 'SO- arrête d'être méchant'

Réponses:

24

Etant donné que a .bashrcest destiné aux shells non connectés, j’évite les commandes renvoyant à l’écran. J'ai également rencontré des expériences dans lesquelles les déclarations d'écho .bashrcentraînent l'échec des commandes sftp et rsync (et peut-être aussi des commandes scp).

# Print some information as we log in
# -s: OS Name -n: Node name -r: OS Release
uname -snr
uptime

En outre, vous n'exécuterez généralement pas ssh-agent à partir d'un shell non interactif. Donc j'ai ça dans .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Stefan Lasiewski
la source
2
Si vous utilisez ~ / .profile au lieu de ~ / .bash_profile, les choses continueront de fonctionner même si vous changez de shells. ~ / .Bash_profile est destiné à des tâches spécifiques.
LassePoulsen
1
Mais bash n'exécutera que soit .bash_profile OU .profile, donc si vous voulez utiliser les deux, vous devez créer un fichier .profile à partir de .bash_profile ou quelque chose du genre. En fait, ce n'est pas une mauvaise idée ...
Don Faulkner
@Source & @Don: Bons points. J'avais l'habitude d'avoir Bashism dans mon .bash_profile, mais maintenant je suis passé à quelque chose de plus universel. Peut-être que l’utilisation de .profile est en ordre.
Stefan Lasiewski
En ce qui concerne les commandes produisant des sorties en .bashrcinterférant avec les méthodes de transfert de fichiers à distance mises en œuvre via des flux standard , la solution consiste à placer ces commandes sous un code qui vérifie si le shell est interactif et ne continue que si c'est le cas. Par défaut des utilisateurs .bashrcdes fichiers dans Ubuntu, copiés à partir /etc/skel/.bashrclors de la création de compte, ainsi que l' ensemble du système /etc/bash.bashrc, contiennent déjà du code qui vérifie et retourne si la coquille est noninteractive (mais il faut encore mettre les commandes de production de sortie d'un sous eux).
Eliah Kagan
8

Byobu est un excellent exemple de quelque chose que vous ne devriez jamais mettre dans un .bashrc.

Sinon, il s'exécutera de manière récursive dans chacun de ses «terminaux virtuels» ;-)

Vous pouvez l'essayer, c'est amusant.

C'est pourquoi tu l' .profileinscris, donc byobu (qui est vraiment un simple wrapper autour de l'écran) n'est chargé qu'une fois, au moment de la connexion. Et Byobu lui-même peut démarrer de nouvelles sessions de bash interactives.

Ralf
la source
C'est un bon exemple. Merci pour le pointeur sur Byobu également. Maintenant, allez l'essayer.
Don Faulkner le