.bashrc: Cleanup path helper functions
authorTony Duckles <tony@nynim.org>
Sat, 3 Mar 2018 18:00:24 +0000
committerTony Duckles <tony@nynim.org>
Sat, 3 Mar 2018 18:00:24 +0000
- Remove functions I never use: `pshift`, `punshift`

- ppop: Misc fixes

- ppush: Support taking in a list of paths to append, and to do
  directory-exists check before apending.

- pinsert: Creating, for pushing an entry on the *beginning* of the list.

- puniq: Strip out empty pieces, and use `paste` for smarter way to glue
  list back together [avoid adding trailing ':' chars].

.bashrc

diff --git a/.bashrc b/.bashrc
index e5d375751efee727f4f5f9255f84f376749d23dd..fc357b531b1e08c0f1c1f312ae5f2dc4c9e09934 100644 (file)
--- a/.bashrc
+++ b/.bashrc
@@ -357,50 +357,64 @@ push_ssh_cert() {
 
 # Usage: pls [<var>]
 # List path entries of PATH or environment variable <var>.
-pls () { eval echo \$${1:-PATH} |tr : '\n'; }
-
-# Usage: pshift [-n <num>] [<var>]
-# Shift <num> entries off the front of PATH or environment var <var>.
-# with the <var> option. Useful: pshift $(pwd)
-pshift () {
-    local n=1
-    [ "$1" = "-n" ] && { n=$(( $2 + 1 )); shift 2; }
-    eval "${1:-PATH}='$(pls |tail -n +$n |tr '\n' :)'"
-}
+pls () { eval echo \$${1:-PATH} | tr ':' '\n'; }
 
 # Usage: ppop [-n <num>] [<var>]
 # Pop <num> entries off the end of PATH or environment variable <var>.
 ppop () {
-    local n=1 i=0
+    local n=1
     [ "$1" = "-n" ] && { n=$2; shift 2; }
-    while [ $i -lt $n ]
-    do eval "${1:-PATH}='\${${1:-PATH}%:*}'"
-       i=$(( i + 1 ))
+    local i=0 var=${1:-PATH}
+    local list=$(eval echo \$$var)
+    while [ $i -lt $n ]; do
+        list=${list%:*}
+        i=$(( i + 1 ))
     done
+    eval "$var='$list'"
 }
 
-# Usage: prm <path> [<var>]
-# Remove <path> from PATH or environment variable <var>.
-prm () { eval "${2:-PATH}='$(pls $2 |grep -v "^$1\$" |tr '\n' :)'"; }
+# Usage: ppush <path> [<var>]
+# Push an entry onto the end of PATH or enviroment variable <var>.
+ppush () {
+    local var=${2:-PATH}
+    local list=$(eval echo \$$var)
+    local i=0 dir=""
+    IFS=':' read -a dirs <<< "$1"
+    for ((i=0; i<${#dirs[@]}; i++)); do
+        dir=$(eval echo "${dirs[$i]}")
+        [ ! -d "$dir" ] && continue
+        [ -n "$list" ] && list="$list:$dir" || list="$dir"
+    done
+    eval "$var='$list'"
+}
 
-# Usage: punshift <path> [<var>]
-# Shift <path> onto the beginning of PATH or environment variable <var>.
-punshift () { eval "${2:-PATH}='$1:$(eval echo \$${2:-PATH})'"; }
+# Usage: pinsert <path> [<var>]
+# Push an entry onto the start of PATH or enviroment variable <var>.
+pinsert () {
+    local var=${2:-PATH}
+    local list=$(eval echo \$$var)
+    local i=0 dir=""
+    IFS=':' read -a dirs <<< "${1}"
+    for ((i=${#dirs[@]}-1; i>=0; i--)); do
+        dir=$(eval echo "${dirs[$i]}")
+        [ ! -d "$dir" ] && continue
+        [ -n "$list" ] && list="$dir:$list" || list="$dir"
+    done
+    eval "$var='$list'"
+}
 
-# Usage: ppush <path> [<var>]
-ppush () { eval "${2:-PATH}='$(eval echo \$${2:-PATH})':$1"; }
+# Usage: prm <path> [<var>]
+# Remove <path> from PATH or environment variable <var>.
+prm () { eval "${2:-PATH}='$(pls $2 | grep -v "^$1\$" | tr '\n' ':')'"; }
 
-# Usage: puniq [<path>]
+# Usage: puniq [<pathlist>]
 # Remove duplicate entries from a PATH style value while retaining
 # the original order. Use PATH if no <path> is given.
 #
 # Example:
 #   $ puniq /usr/bin:/usr/local/bin:/usr/bin
 #   /usr/bin:/usr/local/bin
-puniq () {
-    echo "$1" | tr : '\n' | nl | sort -u -k 2,2 | sort -n |
-    cut -f 2- | tr '\n' : | sed -e 's/:$//' -e 's/^://'
-}
+puniq () { echo "$1" | tr ':' '\n' | grep -v "^$" | nl | sort -u -k 2,2 | sort -n | cut -f 2- | paste -s -d ':'; }
 
 # ---------------------------------------------------------------------------
 # USER SHELL ENVIRONMENT