What's the difference between .bashrc, .bash_profile, and .environment?
bash, environment, shell
Solution
The main difference with shell config files is that some are only read by "login" shells (eg. when you login from another host, or login at the text console of a local unix machine). these are the ones called, say, `.login` or `.profile` or `.zlogin` (depending on which shell you're using).
Then you have config files that are read by "interactive" shells (as in, ones connected to a terminal (or pseudo-terminal in the case of, say, a terminal emulator running under a windowing system). these are the ones with names like `.bashrc`, `.tcshrc`, `.zshrc`, etc.
`bash` complicates this in that `.bashrc` is only read by a shell that's both interactive and non-login, so you'll find most people end up telling their `.bash_profile` to also read `.bashrc` with something like
`[[ -r ~/.bashrc ]] && . ~/.bashrc`
Other shells behave differently - eg with `zsh`, `.zshrc` is always read for an interactive shell, whether it's a login one or not.
The manual page for bash explains the circumstances under which each file is read. Yes, behaviour is generally consistent between machines.
`.profile` is simply the login script filename originally used by `/bin/sh`. `bash`, being generally backwards-compatible with `/bin/sh`, will read `.profile` if one exists.
Problem
I've used a number of different *nix-based systems of the years, and it seems like every flavor of Bash I use has a different algorithm for deciding which startup scripts to run. For the purposes of tasks like setting up environment variables and aliases and printing startup messages (e.g. MOTDs), which startup script is the appropriate place to do these? What's the difference between putting things in `.bashrc`, `.bash_profile`, and `.environment`? I've also seen other files such as `.login`, `.bash_login`, and `.profile`; are these ever relevant? What are the differences in which ones get run when logging in physically, logging in remotely via ssh, and opening a new terminal window? Are there any significant differences across platforms (including Mac OS X (and its Terminal.app) and Cygwin Bash)?