I organise things into multiple `.stuff` files (see [[my stuff files]], and then `bash_common` loads the ones I always want loaded. I put all my stuff that I want all users to be able to access in `/usr/jda` somewhere. (I tend to create a number of users so as to isolate projects and settings. See [[my etc skel]]. So my `.bashrc` is just ```bash # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples . /usr/jda/etc/bash_paths.bashrc # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac # put things in ~/bin/my_stuff/ . /usr/jda/etc/bash_common.bashrc ``` then `/usr/jda/bash_paths ```bash # bash_paths.bashrc -- run first to set PATH and similar # this runs BEFORE we check to see if the shell is interactive or not. # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples PATH="$(tidypath -c "$HOME/bin:/usr/local/cygbin:/usr/jda/bin2:/usr/jda/bin:/usr/jda/bin0:/usr/npm/bin:$PATH:/usr/jda/stuff:/usr/apps:$HOME/perl5/bin")" . pathif.stuff export PYTHONPATH="$(tidypath -c "$HOME/.python:$PYTHONPATH")" export VISUAL=vim EDITOR=vim ``` see below for `tidypath`, and note that things get very borked if this command is not in the `PATH` that bash starts with (so it is one of the few things I put in `/usr/local/bin`). So `/usr/jda/etc/bash_common.bashrc` is ```bash # make less more friendly for non-text input files, see lesspipe(1) [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # this allows me to source a file iff it exists, and ignore silently if not. # useful for things like `~/.cargo/env` which isn't there if I haven't # installed rustup .if() { for s; do [ -f "$s" ] && { . "$s"; }; done; } # this is so I can type ".s t" and get completion for .stuff files .stuff() { if [ $# = 0 ]; then ( cd /usr/jda/stuff; ls *.stuff | cut -f1 -d.; ) else for s; do [ -e /usr/jda/stuff/"$s".stuff ] && . /usr/jda/stuff/"$s".stuff; done; fi } alias .s=.stuff . stuff_completion.stuff . dot_commands.stuff # .w and friends . dircolors.stuff . completion.stuff . cd.stuff . mpd.stuff . hist.stuff . mvdesc.stuff . filecmds.stuff . cygwin.stuff . antlr.stuff . python.stuff . x11.stuff . shopt.stuff . perl.stuff . my_prompt . my.stuff . aliases.stuff . browser.stuff .if . "$HOME/.cargo/env" PATH="$(tidypath -p)" # remove duplicates ``` Here is [my collection of `.stuff` files](jda_stuff.tar.gz). ## Related commands `tidypath` ```perl #!/usr/bin/perl use Cwd 'abs_path'; @p = (); %p = (); $conf = 1; for(@ARGV) { if( /^-f$/ ) { # force inclusion of non-existent paths $conf = 0; next; } if( /^-p$/ ) { # splice in current PATH @a = split ":", $ENV{'PATH'}; for $a(@a) { # force absolute paths (unless -f is active and a path does not exist if( -d "$a" ) { $a = abs_path($a); } elsif( $conf ) { next; } if( ! $p{$a} ) { push @p, $a; $p{$a} = 1; } } next } @a = split ":"; for $a(@a) { # force absolute paths (unless -f is active and a path does not exist if( -d "$a" ) { $a = abs_path($a); } elsif( $conf ) { next; } # add it if not already present if( ! $p{$a} ) { push @p, $a; $p{$a} = 1; } } } $path = join ":", @p; print "$path\n"; ```