.profile all do pretty much the same thing: set up and define functions, variables, and the sorts.
The main difference is that
.bashrc is called at the opening of a non-login but interactive window, and
.bash_profile and the others are called for a login shell. Many people have their
.bash_profile or similar call
Other files of note are:
/etc/profile, for system-wide (not user specific) initialization code.
.bash_logout, triggered when logging out (think cleanup stuff)
.inputrc, similar to
.bashrcbut for readline.
.profile vs .bash_profile (and .bash_login)
.profile is read by most shells on startup, including bash. However,
.bash_profile is used for configurations specific to bash. For general initialization code, put it in
.profile. If it's specific to bash, use
.profile isn't actually designed for bash specifically,
.bash_profile is though instead. (
.profile is for Bourne and other similar shells, which bash is based off) Bash will fall back to
.bash_profile isn't found.
.bash_login is a fallback for
.bash_profile, if it isn't found. Generally best to use