I'm setting up a new Linux machine I got from out 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?

EDIT - I access the shell via ssh: ssh myusername@remotemachine. I have admin priv on it.

link|improve this question

73% accept rate
Show us your the command you use to start your shell. – Nifle Aug 16 '10 at 14:33
feedback

3 Answers

up vote 4 down vote accepted

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
link|improve this answer
@Gilles: That's why I said "be careful of loops" ;) Thanks for pointing out my typo. I've fixed it. – Dennis Williamson Aug 16 '10 at 15:10
2  
If 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 Aug 16 '10 at 17:29
Yeah, I don't really recommend it either. – Dennis Williamson Aug 16 '10 at 18:32
1  
A login shell will try ~/.bash_profile, ~/.bash_login and ~/.profile in order and only open the first one it finds. – Beano Aug 17 '10 at 8:35
feedback

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 ] && . [ -f $HOME/.bashrc ]

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

[[ $- != *i* ]] && return
link|improve this answer
2  
.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 Jan 17 '11 at 20:05
feedback

Doesn't bash load .bash_profile and not .profile? Or is that only specific versions/compilations of bash?

link|improve this answer
1  
Bash loads .bash_profile if it exists, and falls back to .profile otherwise. (Assuming it's started as a login shell.) – Gilles Aug 16 '10 at 14:41
aaaah. Good call. Thx for the info. – peelman Aug 18 '10 at 17:28
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.