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_oncewill be run before any of the others, but then won't be run again (ideally).~/.bashrc_allwill run next, and will be run on every bash invocation. (so keep it light)- Then either
~/.bashrc_scriptor~/.bashrc_interactivewill 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_loginwill be run after the~/.bash_interactive. So~/.bashrc_loginis the one where you'd echo a banner or whatever. For things like setting the PATH, use.bashrc_onceinstead.
In addition to the dispatching, you'll forever have the following available:
$SHELL_PLATFORM(eitherLINUX,OSX,BSD,CYGWINorOTHER),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
~/.profileto this script you may be fine, but since it sometimes gets sourced by a trueshcommand and the script currently has some bash-only stuff, it might not. Specifically, remove the symlink to~/.profileif anything starts acting strange on startup or xwindows-based login. -
Be very careful what you put in
.bashrc_alland.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 tofalseto disable the export of$SHELL_PLATFORMand all theshell_is_*functions and avoid polluting all the other shells' environments. -
Inside
bashrc_dispatchyou can changePRF=to a location other than${HOME}/.to have it look for your newbashrc_*scripts somewhere else. -
In general, modify your
bashrc_dispatchscript 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.
- Joseph Wecker
- Gioele Barabucci http://svario.it/gioele (fixes and optimizations)
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.