X-Git-Url: http://git.iain.cx/?p=profile.git;a=blobdiff_plain;f=.profile.d%2FPATH.bashrc;h=38bb82558f7b760c423768c39e9415f08ad7a5c5;hp=b27435ae9227fb6efb60f04af8a2727a8fbff94d;hb=3075527fd8e750e8221c89d1ba7e74a952e06067;hpb=d615710fbf587dba94e47f35a2b02df8168e567c diff --git a/.profile.d/PATH.bashrc b/.profile.d/PATH.bashrc index b27435a..38bb825 100644 --- a/.profile.d/PATH.bashrc +++ b/.profile.d/PATH.bashrc @@ -121,6 +121,35 @@ function makepath() { eval "export $newpath='$path'" } +# Remove entries which are symlinks to other existing entries. +function canonicalisepath() { + local path="$1"; shift + local newpath= + + local JGD=$IFS + IFS=' +' + + local dirs=$(eval echo "\$$path") + local check=":$dirs:" + for dir in ${dirs//:/ +}; do + if [ -L "$dir" ]; then + # Is this a symlink to another entry? + local canon=$(readlink -f "$dir" 2>/dev/null) + if [ -n "$canon" ]; then + [ "${check/:$canon:/}" = "$check" ] || continue + fi + fi + + newpath="$newpath:$dir" + done + + IFS=$JGD + + eval "export $path='${newpath##:}'" +} + # Construct directory list, omitting nonexistent and undefined ones. dirs= for dir in "${SYSTEM:-@}/${ARCHITECTURE:-@}" "${SYSTEM:-@}" ""; do @@ -141,10 +170,10 @@ for path in $PATHS; do [ -e "$dir" ] || continue makepath "$var" "$dir" done + canonicalisepath "$var" else copypath "$var" "${source#@}" fi done - -unset DIR PATHS dir dirs path var source expandpath sanitisepath copypath makepath newpath addpath +unset DIR PATHS dir dirs path var source expandpath sanitisepath copypath makepath newpath addpath canonicalisepath