Skip to content

Latest commit

 

History

History
126 lines (87 loc) · 3.98 KB

README.md

File metadata and controls

126 lines (87 loc) · 3.98 KB

bashrc_dispatch

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?

Setup / Usage

Symlink all of the following files to bashrc_dispatch (after reading warnings below):

  • ~/.bashrc
  • ~/.bash_profile
  • ~/.profile (better to just get rid of it altogether)
  • ~/.bash_login

And then you can use these instead (in ~/.config/bash):

  • 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,

  1. bashrc_once will be run before any of the others, but then won't be run again (ideally).
  2. bashrc_all will run next, and will be run on every bash invocation. (so keep it light)
  3. Then either bashrc_script or bashrc_interactive will be run next depending on whether or not the bash invocation is interactive.
  4. 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 bashrc_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.

Exported Stuff

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_bsd,
  • 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

Warnings

  • 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 (:

Additional Configuration

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.

  • If you find you need to modify your bashrc_dispatch script, please submit a patch if you like your modification.

Authors

Development

Code : https://github.com/gaelicWizard/bashrc_dispatch

Report issues : https://github.com/gaelicWizard/bashrc_dispatch/issues

License

This is free software released into the public domain.