dot files
What is the difference between .bashrc
and .bash_profile
?
.bash_profile
is executed for login shells, while.bashrc
is executed for interactive non-login shells.
So, what's the difference between a login shell and an interactive non-login shell?
On most *nix systems, when you login to a terminal, .bash_profile
is executed. This happens when you log into your machine, or logging in via SSH. Once logged in, new terminal windows that are opened are launched in "interactive non-login" mode and .bashrc
is executed.
A noteable exception, OSX launches all new terminal instances as login shells.
Why different files for login vs non-login?
Perhaps you want to see some additional information when you first log into a box, in addition or instead of the default, "Last login" details. Such as current system load, the next four hours worth of calendar events, or custom ASCII art welcoming you to your machine.
What type of things do I define in my .bash*
files?
Here are just a few of the components of my .bash*
files.
* PATH
modifications
* ALIAS commands
* Convience Bash functions
* GIT branch name in prompt with coloring
* common macs for work
* Ex: cd into application log file direction and begin tailing the most recent log.
Additionally, I have heard of people adding scheduled jobs to their profile that checks for package manager updates to their tool chain, and provide an alert letting the user know updates are avaible.
What if I have multiple machines?
What if you have multiple machines and you would like consistant terminal behavior between them. Simple, use the same configuration files for all the machines. Create a new GIT repo and store your shared config files there. Then, for each machine you use, simply update that machine's .bash*
file to source in your shared config files.
Your config file could also automatically pull updates from your repo to ensure each machine is always up to date with your most recent config file.
Interesting Bits from my bashrc file
The following snippet gives me a customized bash prompt. Displays the username and hostname, followed by the current directory in purple, and the git branch I have checked out (when in a git repository) in red.
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1='\u@\h \e[35m\w \e[31m$(parse_git_branch)\e[0m$ '