From: Mark Wooding Date: Sun, 8 May 2011 19:14:02 +0000 (+0100) Subject: dot/bash*: Reformat. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/profile/commitdiff_plain/59c9c0e467534a6ee70b6f8fa2e6ed16f12338a9 dot/bash*: Reformat. Some other changes: * Remove the NC_SITES setting, which is only relevant to nCipher: it should end up in a local tweak. * Drop the MANPATH setting, because it wasn't working anyway. We can resurrect that later if we need to. --- diff --git a/dot/bash_logout b/dot/bash_logout index 9e67a16..f3f4429 100644 --- a/dot/bash_logout +++ b/dot/bash_logout @@ -1,6 +1,6 @@ -# -# Bash logout things -# +### -*-sh-*- +### +### Bash logout things -#[ -n "$__mdw_started_pixie" ] && \ -# pixie -C quit +## If there's a local hook, then run it. +[ -f "$HOME/.bash_logout-local" ] && . "$HOME/.bash_logout-local" diff --git a/dot/bash_profile b/dot/bash_profile index 12f5f52..de5a5cf 100644 --- a/dot/bash_profile +++ b/dot/bash_profile @@ -1,23 +1,25 @@ -# -*-sh-*- -# -# Bash startup things -# +### -*-sh-*- +### +### Bash startup things +## Only do any of this if we haven't done it before. Otherwise we +## can have loops and lots of wasted time. if [ -z "$__mdw_profile" ]; then - export __mdw_profile=done -# --- Work out my home directory --- -# -# This horrible trick resolves symbolic links. It enables resolving links, -# changes directory and displays the name of the directory in a subshell -# to avoid changing the current state. - -HOME=`(set -P; cd $HOME; pwd)` -cd $HOME - -# --- Add elements to a path string --- - +###-------------------------------------------------------------------------- +### Utility functions. + +## __mdw_addto VAR DIR PATH ... +## +## VAR is the name of a PATH-like environment variable (i.e., one which +## contains a sequence of pathnames separated by colons). DIR is either `l' +## or `r'. The PATHs are pathnames. Those PATHs which correspond to +## existing directories but which aren't currently named in the variable are +## added to the left or right (depending on DIR) of VAR. The relative order +## of PATHs added in the same invokation is the same as the order they +## appeared in PATHs: the DIR argument only affects which end of the VAR they +## get added to. __mdw_addto () { local var=$1 val dir=$2 new="" change=nil eval "val=\$$var" @@ -26,69 +28,89 @@ __mdw_addto () { case "$new:" in *:$i:*) continue;; esac [ -d $i ] || continue case "X$val" in - X) - val=$i change=t - continue - ;; - X$i) - continue - ;; - X*:$i:*) - val=`echo $val | sed -e "s=:$i:=:="` - ;; - X$i:*) - val=${val#$i:} - ;; - X*:$i) - val=${val%:$i} - ;; + X) val=$i change=t continue ;; + X$i) continue ;; + X*:$i:*) val=`echo $val | sed -e "s=:$i:=:="` ;; + X$i:*) val=${val#$i:} ;; + X*:$i) val=${val%:$i} ;; esac new=$new:$i change=t done case $dir in - l) val=${new#:}:$val;; - r) val=$val$new;; + l) val=${new#:}:$val ;; + r) val=$val$new ;; esac case $change in t) export $var="$val" ;; esac } -# --- Set the path variable --- +## __mdw_programp NAME +## +## Does NAME exist as an executable program? +__mdw_programp () { type -t >/dev/null "$1"; } + +###-------------------------------------------------------------------------- +### Other preliminaries. + +## Work out my home directory. +## +## This horrible trick resolves symbolic links. It enables resolving links, +## changes directory and displays the name of the directory in a subshell to +## avoid changing the current state. +HOME=`(set -P; cd $HOME; pwd)` +cd $HOME + +## Establish a temporary directory. +[ "$TMPDIR" ] || eval `tmpdir -b` +export TMP=$TMPDIR + +## CDE's session structure is demented and doesn't leave us with a proper +## logout hook, so synthesize one here. +[ -n "$DT" ] && trap "source $HOME/.bash_logout" EXIT + +###-------------------------------------------------------------------------- +### Set some basic paths. +## The main path. __mdw_addto PATH l \ $HOME/bin \ {,/usr{,/local}{,/X11R6}}{/bin,/sbin,/games} \ /opt/nfast{,/gcc}{/bin,/sbin} \ $HOME/src/ncipher/scripts + +## If we have Plan 9 from User Space, then add that in. if [ -d /usr/local/plan9 ]; then export PLAN9=/usr/local/plan9 __mdw_addto PATH r \ $PLAN9/bin fi -# --- Find whether a program exists --- - -__mdw_programp () { type -t >/dev/null "$1"; } +## Search for `info' documents. +__mdw_addto INFOPATH r \ + $HOME/info \ + /usr/info /usr/share/info \ + /usr/local/info /usr/local/share/info \ + /usr/local/share/info/its -# --- And the same for manual pages --- +## Script libraries. +__mdw_addto PERLLIB r $HOME/lib/perl +__mdw_addto PYTHONPATH r $HOME/lib/python -case "$MACHTIME" in - *linux*) - MANPATH=`manpath -q` - ;; -esac -__mdw_addto MANPATH l \ - {/usr{,/local}{,/X11R6}{,/share}}/{man,catman} \ - $HOME/man +###-------------------------------------------------------------------------- +### Various other kinds of configuration. -# --- Where my mail comes from --- +## Sensible umask if users have their own groups. +umask 002 +## Mail and general identification. export MAIL=`mdw-conf mailbox` export NAME="Mark Wooding" export EMAIL=`mdw-conf email` export QMAILINJECT=c -# --- Find a text editor --- +## Some programs want to know the hostname. +[ -z "$HOST" ] && export HOST=`hostname` +## Text editor configuration. export MDW_EDITOR=ed emacs_startup_args="--no-site-file --mdw-fast-startup -nw" for ed in \ @@ -103,15 +125,10 @@ for ed in \ break fi done - export EDITOR=mdw-editor VISUAL=mdw-editor -# --- Various options for programs --- - -umask 002 - -[ -z "$HOST" ] && export HOST=`hostname` - +## Determine the locale settings. Really don't set LC_COLLATE because it +## messes with the order of files in `ls' listings and similar. if [ "$DISPLAY" != "" ]; then LANG=`mdw-conf x-ctype` else @@ -130,31 +147,7 @@ fi unset LC_ALL export LC_COLLATE=POSIX LANG -__mdw_programp distcc && export CCACHE_PREFIX=distcc - -export TEXINPUTS=".:$HOME/lib/tex//:" - -__mdw_addto INFOPATH r \ - $HOME/info \ - /usr/info /usr/share/info \ - /usr/local/info /usr/local/share/info \ - /usr/local/share/info/its -__mdw_addto PERLLIB r $HOME/lib/perl -__mdw_addto PYTHONPATH r $HOME/lib/python - -export __MDW_ROOTLY=`mdw-conf rootly` - -[ -z "$LS_OPTIONS" ] && export LS_OPTIONS="-F" - -export BASCAT="-l +n" - -export CVS_RSH=ssh -export CVSROOT=`mdw-conf cvs-root` -export SVNROOT=`mdw-conf svn-root` -export P4CONFIG=.p4 - -export BECOME="--preserve-environment" - +## Pager configuration. export MDW_PAGER=`type -p less` PAGER=mdw-pager METAMAIL_PAGER=mdw-pager export LESS="-iqgRh1FX" export LESSOPEN="|lesspipe.sh %s" @@ -164,14 +157,8 @@ case "${LC_CTYPE-$LANG}" in esac export LESSCHARSET __mdw_programp global && export LESSGLOBALTAGS=global -export NCURSES_NO_UTF8_ACS=1 -# export MAKEFLAGS="-j4" -[ "$TMPDIR" ] || eval `tmpdir -b` -export TMP=$TMPDIR -export PERL_READLINE_NOWARN=yes - -[ -z "$NNTPSERVER" ] && export NNTPSERVER=`mdw-conf nntp-server` +## HTTP and FTP proxies. http=`mdw-conf http-proxy none` case "${http_proxy-none},$http" in *,none) ;; @@ -184,20 +171,55 @@ case "${ftp_proxy-none},$ftp,${http_proxy-none}" in none,*,*) export ftp_proxy=http://$ftp/ ;; esac +## Ncurses programs should use the Unicode box-drawing characters because the +## alternative character set stuff isn't supported well. +export NCURSES_NO_UTF8_ACS=1 + +## Shut up Perl's readline machinery. +export PERL_READLINE_NOWARN=yes + +## If we have `distcc' then tell `ccache' to use it. +__mdw_programp distcc && export CCACHE_PREFIX=distcc + +## Acquiring root privileges. This is mainly the job of `bashrc', but we +## cache the mechanism here. +export __MDW_ROOTLY=`mdw-conf rootly` +export BECOME="--preserve-environment" + +## It's useful to see the little sigils in `ls'. +[ -z "$LS_OPTIONS" ] && export LS_OPTIONS="-F" + +## Settings for BBC BASIC listing. +export BASCAT="-l +n" + +## Version control hacking. +export CVS_RSH=ssh +export CVSROOT=`mdw-conf cvs-root` +export SVNROOT=`mdw-conf svn-root` +export P4CONFIG=.p4 + +## News server. +[ -z "$NNTPSERVER" ] && export NNTPSERVER=`mdw-conf nntp-server` + +## Help X programs find their resources. export XUSERFILESEARCHPATH="$HOME/.Xapps/%N:/usr/lib/X11/%T/%N%S" +## Make OpenOffice.org do its thing properly. export OOO_FORCE_DESKTOP=gnome +## Configure `ps'. export PS_PERSONALITY=gnu -export NC_SITES=cam:bos - -# -- Disable core dumps --- - +## Disable core dumps. ulimit -S -c 0 -# --- Start an ssh authentication agent --- +###-------------------------------------------------------------------------- +### Authentication and SSH hacking. +## Start an authentication agent. This is unnecessarily fiddly. If there's +## a Gnome keyring server then we should use that; unfortunately, it may not +## yet have had a chance to populate the environment with its settings, so we +## go off and fetch them. if { { [ "$GNOME_KEYRING_CONTROL" ] && [ -s "$GNOME_KEYRING_CONTROL" ]; } || { [ "$DBUS_SESSION_BUS_ADDRESS" ] && @@ -210,8 +232,12 @@ then export SSH_AUTH_SOCK fi +## If we still don't have an agent then start one with a stable name. eval `start-ssh-agent -b` +## Decide whether this session should be considered `secure'. A session is +## secure if it's on a secure TTY, but there are lots of ways of finding out +## which TTYs are secure. if [ -z "$__mdw_bashrc" ] && [ "$__mdw_force_secure_session" = "yes" ] || ( tty="`tty`" devtty="(/dev/)?${tty#/dev/}" { { { [ -e /etc/securetty ] && sectty=/etc/securetty; } || @@ -227,10 +253,7 @@ then export __mdw_sechost="`hostname`" fi -[ -n "$DT" ] && trap "source $HOME/.bash_logout" EXIT - -# --- And a passphrase pixie --- - +## Start a passphrase pixie if there is one and it's not already running. if pixie --version >/dev/null 2>&1; then mkdir -p $HOME/.catacomb pixie=${CATACOMB_PIXIE-$HOME/.catacomb/pixie} @@ -242,13 +265,18 @@ if pixie --version >/dev/null 2>&1; then fi fi +###-------------------------------------------------------------------------- +### Finishing touches. + +## If there's a local hook then run it. [ -f "$HOME/.profile-local" ] && . "$HOME/.profile-local" +## End of the `__mdw_profile' guard. fi -# --- Now, if my .bashrc hasn't been run yet, run it --- -# -# Oh, don't do that if we don't have a terminal. - +## If we haven't run the `.bashrc' yet, and this shell is interactive, then +## run it now. [ -z "$__mdw_bashrc" ] && [ -t 0 ] && \ [ -r $HOME/.bashrc ] && . $HOME/.bashrc + +###----- That's all, folks -------------------------------------------------- diff --git a/dot/bashrc b/dot/bashrc index 3ca0748..c39392a 100644 --- a/dot/bashrc +++ b/dot/bashrc @@ -1,19 +1,29 @@ -# -*- mode: sh; coding: utf-8 -*- -# -# Bash session things -# +### -*-sh-*- +### +### Bash session things +## Only do this if we haven't done it before. (Note that this guard isn't +## exported, so subshells will need to make their own arrangements.) if [ -z "$__mdw_bashrc" ]; then - __mdw_bashrc=done +## If we've not run the main profile yet, we should do that first. It sets +## up things we rely on. Also, if there's a system script, we should run +## that too. [ -z "$__mdw_profile" -a -r $HOME/.bash_profile ] && . $HOME/.bash_profile [ -r /etc/bashrc ] && . /etc/bashrc -# --- First of all, set up the prompt string --- +## Set the temporary directory again. (If we've switched users, we'll want a +## different temporary directory.) +[ "${TMPDIR+yes}" ] || eval `tmpdir -b` + +###-------------------------------------------------------------------------- +### Prompt hacking. +## Only bother if the shell is interactive. if [ -t 0 ]; then + ## Fancy highlighting in some terminals. case "$TERM" in linux*|screen*|xterm*|vt100*|eterm*) bold="\[$(tput bold)\]" unbold="\[$(tput sgr0)\]" nl="\[ \]" ;; @@ -21,17 +31,16 @@ if [ -t 0 ]; then bold='' unbold='' nl='' ;; esac + ## Choose the right delimiters. Highlight root prompts specially; + ## highlight when I'm running as some other user. Highlight when this + ## isn't the outermost shell on the terminal. if (( EUID == 0 )); then left=`echo « | iconv -f utf8 -t //translit` right=`echo » | iconv -f utf8 -t //translit` else case $USER in - mdw|mwooding) - u="" left="[" right="]" - ;; - *) - u="\\u@" left="{" right="}" - ;; + mdw|mwooding) u="" left="[" right="]" ;; + *) u="\\u@" left="{" right="}" ;; esac if [ "$__mdw_tty" = "`tty`" ]; then left="<" right=">" @@ -40,25 +49,23 @@ if [ -t 0 ]; then fi fi + ## If this session is insecure then highlight that. if [ -z "$SSH_CLIENT" ] && [ "$__mdw_sechost" != "`hostname`" ] then sec_l='(' sec_r=')' fi + ## Build the prompt string. PS1="$nl$bold$left$sec_l$u\\h$sec_r \\w$right$unbold" PS2="$PS1 $bold>$unbold " -fi # is stdin a tty? - -# --- Pagers are less useful within Emacs --- - -case "$INSIDE_EMACS" in - 22.*,comint) export PAGER=cat ;; -esac +fi -# --- Little preferences --- +###-------------------------------------------------------------------------- +### Other shell tweaking. +## Random shell tweaks. notify=1 set -b shopt -u cdable_vars @@ -84,24 +91,31 @@ shopt -u nullglob shopt -s promptvars shopt -u shift_verbose shopt -s sourcepath - HISTCONTROL=ignorespace:erasedups -# --- Set the CDPATH --- -# -# CDPATH=~/src:/usr/src:/usr/lib:/usr/share -# dots=.. -# i=6 -# while (( i > 0 )); do -# CDPATH=$CDPATH:$dots -# dots=$dots/.. -# (( i -= 1 )) -# done -# CDPATH=$CDPATH:/ +## Some handy aliases. +alias cx='chmod a+x' +alias which="command -v" +alias rc="rc -l" +alias ssync="rsync -e ssh" +alias rootly=$__MDW_ROOTLY +alias r=rootly +alias re="rootly $EDITOR" +alias pstree="pstree -hl" +alias cdtmp='cd ${TMPDIR-/tmp}' +alias pushtmp='pushd ${TMPDIR-/tmp}' +alias e="$EDITOR" +alias svn="svnwrap svn" +alias @="ssh" -# --- Some colour `ls' support --- +## Completion. +[ -r /etc/bash_completion ] && . /etc/bash_completion +[ -r $HOME/.bash_completion ] && . $HOME/.bash_completion -[ "${TMPDIR+yes}" ] || eval `tmpdir -b` +###-------------------------------------------------------------------------- +### Colour output. + +## Arrange for `ls' output to be in colour. if [ -x /usr/bin/dircolors -o -x /usr/local/bin/dircolors ]; then eval `dircolors -b ~/.dircolors` else @@ -116,8 +130,7 @@ ls () { fi } -# --- Some colour `grep' support --- - +## Arrange for `grep' output to be in colour. export GREP_COLORS="mt=01;31:ms=01;31:mc=031;31:fn=36:ln=36:bn=36:se=34" greplike () { @@ -133,27 +146,17 @@ alias egrep="greplike egrep" alias fgrep="greplike fgrep" alias zgrep="greplike zgrep" -# --- Set up some simple aliases --- - -alias cx='chmod a+x' -alias which="command -v" -alias rc="rc -l" -alias ssync="rsync -e ssh" -alias rootly=$__MDW_ROOTLY -alias r=rootly -alias re="rootly $EDITOR" -alias pstree="pstree -hl" -alias cdtmp='cd ${TMPDIR-/tmp}' -alias pushtmp='pushd ${TMPDIR-/tmp}' -alias e="$EDITOR" -alias svn="svnwrap svn" -alias @="ssh" - -[ -r /etc/bash_completion ] && . /etc/bash_completion -[ -r $HOME/.bash_completion ] && . $HOME/.bash_completion +## Turn off pagers inside Emacs shell buffers. +case "$INSIDE_EMACS" in + 22.*,comint) export PAGER=cat ;; +esac -# --- Make `xt' start an xterm, maybe logging into a remote host --- +###-------------------------------------------------------------------------- +### More complicated shell functions. +## xt [@HOST] XTERM-ARGS +## +## Open a terminal, maybe on a remote host. xt () { case "$1" in @*) @@ -172,16 +175,13 @@ xt () { esac } -# --- Turning on and off core dumps --- - +## core [y|n] +## +## Tweak core dumps on and off, or show the current status. core () { case "x$1" in - xon|xy|xyes) - ulimit -Sc `ulimit -Hc` - ;; - xoff|xn|xno) - ulimit -Sc 0 - ;; + xon|xy|xyes) ulimit -Sc `ulimit -Hc` ;; + xoff|xn|xno) ulimit -Sc 0 ;; x) local l=`ulimit -Sc` case $l in @@ -191,14 +191,64 @@ core () { esac ;; *) - echo >&2 "usage: core [yn]" + echo >&2 "usage: core [y|n]" return 1 ;; esac } -# --- Turning on and off path hacks --- +## world [NAME] +## +## Set current security world to NAME. With no NAME, print the currently +## selected world. +world () { + local nfast=${NFAST_HOME-/opt/nfast} + local kmdata + case "$#" in + 0) + echo "${NFAST_KMDATA#$nfast/kmdata-}" + ;; + *) + if [ -d "$1" ]; then + kmdata=$1 + elif [ -d "$nfast/kmdata-$1" ]; then + kmdata=$nfast/kmdata-$1 + else + echo >&2 "world: can't find world $1" + return 1 + fi + shift + case "$#" in + 0) export NFAST_KMDATA=$kmdata ;; + *) "$@" ;; + esac + ;; + esac +} + +## Fix `man' under Slowaris. +case "$MACHTYPE" in + *solaris*) + man () { + declare -i i=0 + declare arg + declare -a man + for arg; do + case "$arg" in [0-9]*) man[i+=1]="-s" ;; esac + man[i+=1]="$arg" + done + command man "${man[@]}" + } + ;; +esac + +###-------------------------------------------------------------------------- +### Path hacks. +## path-add [VAR] DIR +## +## Add DIR to the beginning of PATH-like variable VAR (defaults to PATH) if +## it's not there already. path-add () { local pathvar export dir val case $# in @@ -215,6 +265,10 @@ path-add () { $export } +## path-remove [VAR] DIR +## +## Remove DIR from PATH-like variable VAR (defaults to PATH); it's not an +## error if DIR isn't in VAR. path-remove () { local pathvar export dir val case $# in @@ -233,6 +287,13 @@ path-remove () { $export } +## pathhack [-f] +HACK|-HACK... +## +## Each HACK refers to a subdirectory of `~/bin/hacks'. A hack name preceded +## by `+' adds the directory to the PATH; a `-' removes. Adding a hack +## that's already on the PATH doesn't do anything unless `-f' is set, in +## which case it gets moved to the beginning. With no arguments, print the +## currently installed hacks. pathhack () { if [ $# -eq 0 ]; then local IFS=: @@ -295,58 +356,19 @@ pathhack () { fi } -# --- Switching security worlds --- - -world () { - local nfast=${NFAST_HOME-/opt/nfast} - local kmdata - case "$#" in - 0) - echo "${NFAST_KMDATA#$nfast/kmdata-}" - ;; - *) - if [ -d "$1" ]; then - kmdata=$1 - elif [ -d "$nfast/kmdata-$1" ]; then - kmdata=$nfast/kmdata-$1 - else - echo >&2 "world: can't find world $1" - return 1 - fi - shift - case "$#" in - 0) export NFAST_KMDATA=$kmdata ;; - *) "$@" ;; - esac - ;; - esac -} - -# --- Fix `man' under Slowaris --- - -case "$MACHTYPE" in - *solaris*) - man () { - declare -i i=0 - declare arg - declare -a man - - for arg; do - case "$arg" in [0-9]*) man[i+=1]="-s" ;; esac - man[i+=1]="$arg" - done - command man "${man[@]}" - } - ;; -esac - -# --- For `root' use -- some simple molly-guards --- +###-------------------------------------------------------------------------- +### Finishing touches. +## For `root' use -- some simple molly-guards. if (( UID == 0 )); then alias rm='rm -i' cp='cp -i' mv='mv -i' set -o noclobber fi +## Run any local hooks. [ -f "$HOME/.bashrc-local" ] && . "$HOME/.bashrc-local" +## Close the `__mdw_bashrc' guard. fi + +###----- That's all, folks --------------------------------------------------