#!/bin/bash # All the prefixes to consider prefixes=( "$HOME" "$HOME/.local.`uname -m`" "$HOME/.local" "$HOME/.prefix.`uname -m`" "$HOME/.prefix" "$HOME"/.gem/ruby/* ) ###################################################################### in_array() { local needle=$1; shift local haystack=("$@") local straw for straw in "${haystack[@]}"; do [[ "$needle" == "$straw" ]] && return 0 done return 1 } # Import existing values IFS=: paths=($PATH) IFS=: manpaths=($MANPATH) IFS=: rubylibs=($RUBYLIB) IFS=: perl5libs=($PERL5LIB) # Scan through prefixes for prefix in "${prefixes[@]}"; do # PATH for dir in "$prefix/bin" "$prefix/sbin"; do if [[ -d "$dir" ]] && ! in_array "$dir" "${paths[@]}"; then paths=("$dir" "${paths[@]}") fi done # MANPATH dir="$prefix/share/man" if [[ -d "$dir" ]] && ! in_array "$dir" "${manpaths[@]}"; then manpaths=("$dir" "${manpaths[@]}") fi # RUBYLIB dir="$prefix/lib" if [[ -d "$dir" ]] && ! in_array "$dir" "${rubylibs[@]}"; then rubylibs=("$dir" "${rubylibs[@]}") fi # PERL5LIB for dir in "$prefix"/lib*/perl5; do if [[ -d "$dir" ]] && in_array "$dir" "${manpaths[@]}"; then perl5libs=("$dir" "${perl5libs[@]}") fi done done # Finally, print our values IFS=: PATH="${paths[*]}" IFS=: MANPATH="${manpaths[*]}" IFS=: RUBYLIB="${rubylibs[*]}" IFS=: PERL5LIB="${perl5libs[*]}" # The sed bit here is the only time we call an external program { declare -p PATH declare -p MANPATH declare -p RUBYLIB declare -p PERL5LIB } | sed 's/^declare \(-\S* \)*//'