blob: 812f5f0f58d3c3c74ca59e9a85b9930c52bc5d84 (
plain) (
tree)
|
|
# Function to manage contents of PATH variable within the current shell
path() {
# Check first argument to figure out operation
case $1 in
# List current directories in PATH
list|'')
set -- "$PATH":
while [ -n "$1" ] ; do
case $1 in
:*) ;;
*) printf '%s\n' "${1%%:*}" ;;
esac
set -- "${1#*:}"
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)
if ! [ "$#" -eq 2 ] ; then
set -- "$1" "$PWD"
fi
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)
if ! [ "$#" -eq 2 ] ; then
set -- "$1" "$PWD"
fi
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)
if ! [ "$#" -eq 2 ] ; then
set -- "$1" "$PWD"
fi
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%%:}
;;
# Remove the first directory in $PATH
shift)
case $PATH in
'')
printf >&2 'path(): %s: PATH is empty!\n' "$@"
return 1
;;
*:*)
PATH=${PATH#*:}
;;
*)
# shellcheck disable=SC2123
PATH=
;;
esac
;;
# Remove the last directory in $PATH
pop)
case $PATH in
'')
printf >&2 'path(): %s: PATH is empty!\n' "$@"
return 1
;;
*:*)
PATH=${PATH%:*}
;;
*)
# shellcheck disable=SC2123
PATH=
;;
esac
;;
# Check whether a directory is in PATH
check)
path _argcheck "$@" || return
if ! [ "$#" -eq 2 ] ; then
set -- "$1" "$PWD"
fi
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)
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 shift
Remove the first directory from PATH
path pop
Remove the last directory from PATH
path check [DIR]
Return whether directory DIR (default $PWD) is in PATH
path help
Print this help message
EOF
;;
# Command not found
*)
printf >&2 \
'path(): %s: Unknown command (try "help")\n' \
"$1"
return 2
;;
esac
}
|