51

I know the difference between the two bash login scripts:

.bashrc is run only by "non-login" shells.

.bash_profile (or .bash_login or .profile) is executed by "login" shells.

Does anyone have some good examples of what things that are a better fit for login-only execution, such that I'd only put them in .bash_profile, but they wouldn't really make sense in .bashrc?

(I know most of us source .bashrc out of .bash_profile, so there doesn't seem to be much point in the opposite question...)

Kevin Bowen
  • 19,395
  • 55
  • 76
  • 81
Don Faulkner
  • 985
  • 2
  • 7
  • 13

2 Answers2

26

Since a .bashrc is for non-login shells, I avoid any commands which echo to the screen. I've also run into experiences where echo statements in .bashrc will cause sftp and rsync commands to fail (and maybe scp commands as well).

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

Also, you generally won't run ssh-agent from a non-interactive shell. So I have this in .bash_profile.

if [ -f ~/.ssh/ssh-agent ]; then . ~/.ssh/ssh-agent; fi
Kevin Bowen
  • 19,395
  • 55
  • 76
  • 81
Stefan Lasiewski
  • 4,120
  • 6
  • 30
  • 34
  • 2
    If you use ~/.profile instead of ~/.bash_profile things will still work even if you change shells.. ~/.bash_profile is for bash specific things. – LassePoulsen Aug 07 '10 at 08:55
  • 1
    But bash will only run EITHER .bash_profile OR .profile, so if you're going to use both, you need to source .profile from within .bash_profile or something. That isn't a bad idea, actually... – Don Faulkner Aug 09 '10 at 14:43
  • @Source & @Don : Good points. I used to have Bashisms in my .bash_profile, but now I've switched to something more universal. Maybe using .profile is in order. – Stefan Lasiewski Aug 09 '10 at 23:26
  • Regarding [output-producing commands in `.bashrc` interfering with remote file transfer methods implemented via standard streams](https://askubuntu.com/questions/976183/scp-033h-message), the solution is to put such commands *under* code that checks if the shell is interactive and continues only if it is. Users' default `.bashrc` files in Ubuntu, copied from `/etc/skel/.bashrc` upon account creation, as well as the systemwide `/etc/bash.bashrc`, already contain code that checks and returns if the shell is noninteractive (though one must still put one's output-producing commands *under* them). – Eliah Kagan Nov 19 '17 at 14:09
10

Byobu is a great example of something you should never ever put in a .bashrc.

Otherwise, it will recursively run itself in every single one of its 'virtual terminals' ;-)

You can try it though, it's sort of fun.

That why you put it in .profile, so byobu (which really is a just wrapper around screen) is only loaded, once, at login-time. And byobu itself can start new interactive bash sessions.

Kevin Bowen
  • 19,395
  • 55
  • 76
  • 81
Ralf
  • 2,096
  • 1
  • 13
  • 9