Bash not loading '.profile' in new session on Linux

23

8

I'm setting up a new Linux machine I got from our IT dept, and noticed .profile is not loaded when I start a new terminal session. The current shell is Bash, though I changed it from the default sh it came with. How do I make it load .profile on startup?

I access the shell via SSH: ssh myusername@remotemachine. I have administrator privileges on it.

sa125

Posted 2010-08-16T14:23:03.037

Reputation: 916

Show us your the command you use to start your shell. – Nifle – 2010-08-16T14:33:37.927

Answers

24

When Bash starts as an interactive login shell, one of the files it may process is ~/.profile.

When it starts as an interactive non-login shell it doesn't. It processes /etc/bash.bashrc (if that file or a similar file is enabled in your version of Bash) and ~/.bashrc.

You could add the following to your ~/.bashrc (but be careful of loops or values being changed inadvertently):

. $HOME/.profile

Paused until further notice.

Posted 2010-08-16T14:23:03.037

Reputation: 86 075

3As others have said, this is NOT recommended, since the usual way is for profile and "friends" (.bash_profile) to source .bashrc, and not the other way. It could be that your terminal program is NOT a login shell, but an interactive non-login shell. Often there's a preference you can set -- make it a login shell to get .profile, .login and/or .bash_profile to execute. – rholmes – 2016-10-10T15:09:09.283

8If you're going to have your .bashrc source your .profile (which i don't recommend) you should have some guard against double sourcing. Set some guard variable or so

[ -z "$SOME_VAR_SET_IN_PROFILE" ] && . ~/.profile – Rich Homolka – 2010-08-16T17:29:58.183

2Yeah, I don't really recommend it either. – Paused until further notice. – 2010-08-16T18:32:28.453

13A login shell will try ~/.bash_profile, ~/.bash_login and ~/.profile in order and only open the first one it finds. – Beano – 2010-08-17T08:35:04.057

16

It kind of depends how you start your shell. As others have said, a login shell will load your profile (it will look for .bash_profile first, then will try .profile). If it finds one of these, it loads them. A non-login shell (either interactive or non-interactive) will source .bashrc.

I'd suggest putting everything into .bashrc. The .profile/.bashrc split was kind of arbitrary and made more sense in the old days of UNIX when tty wasn't just a device name and meant an actual TeleType. It was meant to start certain things (like checking mail) on the 'main' login to a server, and just normal setup stuff for other shells. In most Linuxes you will log in now, you're not really logging into a shell, as you're logging into some graphical interface (KDE, gnome, CDE 'shudder'). The "spawn login processes" is now taken care of by your session manager. It's much less relevant now.

My suggestion: Make your .profile consist of solely:

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

as the first line of .bashrc, guard against weird stuff happening when running a bash script by jumping out early:

[[ $- != *i* ]] && return

Rich Homolka

Posted 2010-08-16T14:23:03.037

Reputation: 27 121

@Rich Homolka Why is [ -f $HOME/.bashrc ] twice in your command? How is the command you posted different from just '. $HOME/.bashrc' ? – David Doria – 2015-04-29T17:56:27.130

1Protip: Don't put anything in your .bashrc that writes to stdout or stderr, as that can break non-interactive clients for things such as SCP. Things with output (for example, I like to be greeted with a fortune cookie and uptime) should only go in .profile / .bash_profile – Brian A. Henning – 2016-03-08T15:07:10.563

@Lotharyx true. We had a standard-ish kshrc that exported to stdout, broke out Xserver (hummingbird exceed) – Rich Homolka – 2016-03-08T15:28:54.367

5.profile should be kept bash agnostic. I suggest to configure .bash_profile to load .profile and then load .bashrc. put only bash agnostic stuff in .profile, like PATH and the LC_* stuff. Put the rest in .bashrc. – lesmana – 2011-01-17T20:05:36.387