File: path-funcs-sh# path-funcs-sh # Copyright 2001,2004 Chris F.A. Johnson # Released under the terms of the GNU General Public License path() { if [ -n "$*" ]; then addpath "$@" || return else ( ## Use a subshell so IFS is not changed in the main shell IFS=: printf "%s\n" ${PATH} ) fi } _unslash() { _UNSLASH=$1 while : do case $_UNSLASH in ## remove trailing slashes */) _UNSLASH=${_UNSLASH%/} ;; ## change // to / *//*) type _gsub >/dev/null 2>&1 || . string-funcs _gsub "$_UNSLASH" "//" "/" _UNSLASH=$_GSUB ;; *) break ;; esac done } unslash() { _unslash "$@" && printf "%s\n" "$_UNSLASH" } checkpath() { verbose=0 OPTIND=1 while getopts v var do case "$var" in v) verbose=1 ;; esac done ## assign the directories in PATH to the positional parameters oldIFS=$IFS IFS=":" set -- $PATH IFS=$oldIFS newPATH= for p ## Loop through directories in $PATH (now set as positional parameters) do case $p in ""|.) continue ;; ## do not allow current directory in PATH esac if [ -d "$p" ] ## Is it actually a directory? then _unslash "$p" ## Remove multiple slashes p=$_UNSLASH case :$newPATH: in *:"$p":*) [ $verbose -ge 1 ] && echo "checkpath: removing $p (already in PATH)" >&2 ;; *) newPATH=${newPATH:+$newPATH:}$p ;; ## Add directory esac else [ $verbose -ge 1 ] && echo "checkpath: $p is not a directory; removing it from PATH" >&2 fi done PATH=$newPATH } addpath() { ## Set defaults prefix=0 ## Do not insert at beginning of PATH quiet=0 ## Do print information on bad directories ## Parse command-line options OPTIND=1 while getopts iq var do case "$var" in i) prefix=1 ;; q) quiet=1 ;; esac done shift $(( $OPTIND - 1 )) for p ## Loop through directories on the command line do _unslash "$p" ## remove double slashes p=$_UNSLASH case :$PATH: in *:$p:*) [ $quiet -eq 0 ] && echo "addpath: $p already in path" >&2 continue ## Skip directories already in PATH ;; esac if [ -d "$p" ] then if [ $prefix -eq 1 ] then PATH="$p:$PATH" else PATH="$PATH:$p" fi else [ $quiet -eq 0 ] && echo "addpath: $p is not a directory" >&2 fi done } rmpath() # remove directory or directories from $PATH { for p in "$@" do _unslash "$p" p=$_UNSLASH case $PATH in ## Look for directory.... "$p":*) PATH=${PATH#$p:} ;; ## at beginning of PATH *:"$p") PATH=${PATH%:$p} ;; ## at end of PATH *:"$p":*) type _sub >/dev/null 2>&1 || . string-funcs _sub "$PATH" ":$p:" ":" ## in the middle PATH=$_SUB ;; esac done } Download: path-funcs-sh |