From 6f30ac188d687522f56b41ebafe7e49c322af038 Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Wed, 13 Apr 2022 17:04:46 -0500 Subject: Add path_add_unsafe and change path munging --- profile/00_functions.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 profile/00_functions.sh (limited to 'profile/00_functions.sh') diff --git a/profile/00_functions.sh b/profile/00_functions.sh new file mode 100644 index 0000000..a94eaee --- /dev/null +++ b/profile/00_functions.sh @@ -0,0 +1,62 @@ +# utility functions for all shells +# these should be POSIX-compatible. + +# add a path to PATH, but only if it's not already there +path_add_to_PATH() { # path_add [-a] PATH... + # -a appends (default is prepend) + APPEND=false + if [ "x$1" = "x-a" ]; then + APPEND=true + shift + fi + + for p; do + case ":$PATH:" in + *:"$p":*) ;; + *) + if $APPEND; then + PATH="$PATH:$p" + else + PATH="$p:$PATH" + fi + ;; + esac + done + + unset APPEND +} + +# Generalization of `path_add_to_PATH' for any variable. +path_add_unsafe() { #path_add_unsafe [-a] [-d DELIM] VAR PATH... + ## Add PATH... to VAR, delimiting with DELIM (default :). + # By default, the VAR will be prepended to; passing -a will append the + # variable. -d DELIM defines the delimiter. + # + # This function has the _unsafe suffix because it uses `eval' to set + # variables. + APPEND=false; DELIM=: + while getopts ad: opt; do + case "$opt" in + a) APPEND=true ;; + d) DELIM="$OPTARG" ;; + *) return 1 ;; + esac + done + shift $(expr $OPTIND - 1) + + var="$1"; shift + + for path; do + case ":$(eval "echo \$$var"):" in + *:"$path":*) ;; + *) + if $APPEND; then + eval "$var=\$$var${var:+$DELIM}$path" + else + eval "$var=$path${var:+$DELIM}\$$var" + fi + ;; + esac + done + unset -v APPEND DELIM var +} -- cgit 1.4.1-21-gabe81