Different bash configurations for Linux vs OSX, interactive vs batch
(For related discussion see hackernews)
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 OS X) treats them differently from Linux?
Are you tired of not having your ~/.bash*
stuff work the way you expect?
Symlink all of the following files to bashrc_dispatch
(after reading warnings
below):
~/.bashrc
~/.bash_profile
~/.profile
(only if your scripts are all 'sh' compatible- otherwise get rid of it altogether)~/.bash_login
And then you can use these instead:
~/.bashrc_once
: sourced at least once, and in most circumstances only once- before anything else.~/.bashrc_all
: sourced on every bash instantiation~/.bashrc_script
: sourced only when non-interactive / batch~/.bashrc_interactive
: the one you'll probably fill up (mutually exclusive with ~/.bashrc_script
)~/.bashrc_login
: sourced only when an interactive shell is also a login.To reiterate,
~/.bashrc_once
will be run before any of the others, but then won't be run
again (ideally).~/.bashrc_all
will run next, and will be run on every bash invocation.
(so keep it light)~/.bashrc_script
or ~/.bashrc_interactive
will be run
next depending on whether or not the bash invocation is interactive.~/.bashrc_login
will be run
after the ~/.bash_interactive
. So ~/.bashrc_login
is the one where
you'd echo a banner or whatever. For things like setting the PATH, use
.bashrc_once
instead.In addition to the dispatching, you'll forever have the following available:
$SHELL_PLATFORM
(either LINUX
, OSX
, BSD
, CYGWIN
or OTHER
),shell_is_linux
,shell_is_osx
,shell_is_cygwin
,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
Obviously don't simply blow away your existing startup scripts if they have
anything in them- you'll need their content to populate the new bashrc_*
stuff.
If you symlink ~/.profile
to this script you may be fine, but since it
sometimes gets sourced by a true sh
command and the script currently has
some bash-only stuff, it might not. Specifically, remove the symlink to
~/.profile
if anything starts acting strange on startup or xwindows-based
login.
Be very careful what you put in .bashrc_all
and .bashrc_script
- it may
slow the system down. I put them there for conceptual completeness- that
doesn't mean you have to use them (:
There are few knobs you can turn to make bashrc_dispatch
behave as you prefer.
EXPORT_FUNCTIONS
: set it to false
to disable the export of
$SHELL_PLATFORM
and all the shell_is_*
functions and avoid polluting all
the other shells' environments.
Inside bashrc_dispatch
you can change PRF=
to a location other than
${HOME}/.
to have it look for your new bashrc_*
scripts somewhere else.
In general, modify your bashrc_dispatch
script as much as you need to.
You'll see there's not a lot of code there. Much less code then there are
comments in this readme. Please share a patch if you like your modification.
Code : https://github.com/josephwecker/bashrc_dispatch
Report issues : https://github.com/josephwecker/bashrc_dispatch/issues
This is free software released into the public domain.