blob: 23eec75b3ed1c2682b6f105d70611bb22a01e29a (
plain) (
tree)
|
|
# Function to manage contents of PATH variable within the current shell
path() {
# The second argument, the directory, can never have a colon
case $2 in
*:*)
printf >&2 'path(): %s illegal colon\n' "$2"
return 2
;;
esac
# Check first argument to figure out operation
case $1 in
# List current directories in PATH
list|'') (
# shellcheck disable=SC2030
path=$PATH:
while [ -n "$path" ] ; do
dir=${path%%:*}
path=${path#*:}
[ -n "$dir" ] || continue
printf '%s\n' "$dir"
done
) ;;
# Helper function checks directory argument makes sense
_argcheck)
shift
if [ "$#" -gt 2 ] ; then
printf >&2 'path(): %s: too many arguments\n' "$1"
return 2
fi
case $2 in
*:*)
printf >&2 'path(): %s: %s contains colon\n' "$@"
return 2
;;
esac
return 0
;;
# Add a directory at the start of $PATH
insert)
[ "$#" -eq 2 ] || set -- "$1" "$PWD"
path _argcheck "$@" || return
if path check "$2" ; then
printf >&2 'path(): %s: %s already in PATH\n' "$@"
return 1
fi
PATH=${2}${PATH:+:"$PATH"}
;;
# Add a directory to the end of $PATH
append)
[ "$#" -eq 2 ] || set -- "$1" "$PWD"
path _argcheck "$@" || return
if path check "$2" ; then
printf >&2 'path(): %s: %s already in PATH\n' "$@"
return 1
fi
PATH=${PATH:+"$PATH":}${2}
;;
# Remove a directory from $PATH
remove)
[ "$#" -eq 2 ] || set -- "$1" "$PWD"
path _argcheck "$@" || return
if ! path check "$2" ; then
printf >&2 'path(): %s: %s not in PATH\n' "$@"
return 1
fi
PATH=$(
path=:$PATH:
path=${path%%:"$2":*}:${path#*:"$2":}
path=${path#:}
printf '%s:' "$path"
)
PATH=${PATH%%:}
;;
# Check whether a directory is in PATH
check)
path _argcheck "$@" || return
[ "$#" -eq 2 ] || set -- "$1" "$PWD"
case :$PATH: in
*:"$2":*) return 0 ;;
esac
return 1
;;
# Print help output (also done if command not found)
help)
cat <<'EOF'
path(): Manage contents of PATH variable
USAGE:
path [list]
Print the current directories in PATH, one per line (default command)
path insert [DIR]
Add directory DIR (default $PWD) to the front of PATH
path append [DIR]
Add directory DIR (default $PWD) to the end of PATH
path remove [DIR]
Remove directory DIR (default $PWD) from PATH
path check [DIR]
Return whether directory DIR (default $PWD) is a component of PATH
path help
Print this help message
EOF
;;
# Command not found
*)
printf >&2 'path(): %s: Unknown command (try "help")\n' "$1"
return 2
;;
esac
}
|