Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Replace .bashrc, .bash_profile, .profile, etc. with something much more clean, consistent, and meaningful. Now a repo: https://github.com/josephwecker/bashrc_dispatch
#!/bin/bash
# License: Public Domain.
# Author: Joseph Wecker, 2012
#
# -- DEPRICATED --
# This gist is slow and is missing .bashrc_once
# Use the one in the repo instead! https://github.com/josephwecker/bashrc_dispatch
# (Thanks gioele)
#
# Are you tired of trying to remember what .bashrc does vs .bash_profile vs .profile?
# Are you tired of trying to remember how darwin/mac-osx treat them differently from linux?
# Are you tired of not having your ~/.bash* stuff work the way you expect?
#
# Symlink all of the following to this file:
# * ~/.bashrc
# * ~/.bash_profile
# * ~/.profile
# * ~/.bash_login
#
# And then you can use these instead:
# * ~/.bashrc_all sourced on every bash instantiation
# * ~/.bashrc_script sourced only when non-interactive
# * ~/.bashrc_interactive the one you'll probably fill up (MUTALLY EXCLUSIVE w/ .bashrc_script)
# * ~/.bashrc_login sourced only when an interactive is also a login
#
# To reiterate, `.bashrc_all` will always be run first.
# Then either `.bashrc_script` OR `.bashrc_interactive` will be run next
# depending on whether or not the bash invocation is... interactive.
# Finally, sometimes, like when you first ssh into a machine or often when
# opening a new terminal window on a mac, the `.bashrc_login` will be run
# after the `.bash_interactive`. So `.bashrc_login` is the one where you'd echo
# a banner or whatever.
#
#
# In addition to the dispatching, you'll see below that you'll forever have the
# following available:
# * $SHELL_PLATFORM # (at the moment just 'LINUX', 'OSX', or 'OTHER')
# * shell_is_linux
# * shell_is_osx
# * shell_is_interactive
# * shell_is_script
#
# The functions are meant for clean conditionals in your new .bashrc_* scripts-
# like:
# $ shell_is_linux && echo 'leenux!'
# or something like:
# $ if shell_is_interactive; then echo 'interact'; fi
# etc... And now I think these comments have reached parity with the code
# itself which should be easy to extend.
#
#
[ -n "$SHELL_FOR" ] && [ $$ -eq "$SHELL_FOR" ] && exit # Avoid recursive invocation
SHELL_FOR=$$
export SHELL_PLATFORM='OTHER'
unamestr=`uname`
if [[ "$unamestr" == 'Linux' ]]; then SHELL_PLATFORM='LINUX';
elif [[ "$unamestr" == 'Darwin' ]]; then SHELL_PLATFORM='OSX';
fi
if [ -z "$SHELL_DISPATCH_FUNCTIONS" ]; then
shell_is_linux () { return `[[ "$SHELL_PLATFORM" == 'LINUX' ]]`; }
shell_is_osx () { return `[[ "$SHELL_PLATFORM" == 'OSX' ]]`; }
shell_is_login () { return `shopt -q login_shell`; }
shell_is_interactive () { return `[ -n "$PS1" ]`; }
shell_is_script () { return `! shell_is_interactive`; }
export -f shell_is_linux
export -f shell_is_osx
export -f shell_is_login
export -f shell_is_interactive
export -f shell_is_script
export SHELL_DISPATCH_FUNCTIONS=1
fi
[ -z "$BASH_ENV" ] && export BASH_ENV="$BASH_SOURCE"
# Now dispatch special files
[ -f "${HOME}/.bashrc_all" ] && source "${HOME}/.bashrc_all"
[ -f "${HOME}/.bashrc_script" ] && shell_is_script && source "${HOME}/.bashrc_script"
[ -f "${HOME}/.bashrc_interactive" ] && shell_is_interactive && source "${HOME}/.bashrc_interactive"
[ -f "${HOME}/.bashrc_login" ] && shell_is_login && source "${HOME}/.bashrc_login"
@bsandrow

This comment has been minimized.

Copy link

bsandrow commented Aug 11, 2012

The exit should be a "return." For example, try this:

$ echo 'exit' >> /tmp/test.sh
$ source /tmp/test.sh

I don't know for 100% certain if it's handled exactly the same way during shell start-up, but return seems the safer bet in my book.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.