将重复项保留在源的 $PATH 之外

xen*_*ide 24 shell path shell-script environment-variables posix

我有以下代码,它是source我的-d.shellrc

PATH="${PATH}:${HOME}/perl5/bin"
PATH="${PATH}:${HOME}/.bin"
export PATH
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改其他代码然后更改source此文件,则每个源的路径都会越来越长,每次都在它们已经存在时追加。我能做些什么来防止这种情况?

Gil*_*il' 12

add_to_PATH () {
  for d; do
    d=$({ cd -- "$d" && { pwd -P || pwd; } } 2>/dev/null)  # canonicalize symbolic links
    if [ -z "$d" ]; then continue; fi  # skip nonexistent directory
    case ":$PATH:" in
      *":$d:"*) :;;
      *) PATH=$PATH:$d;;
    esac
  done
}
add_to_PATH ~/perl5/bin ~/.bin
Run Code Online (Sandbox Code Playgroud)

符号链接规范化的行是可选的。如果删除它,也删除下一行(如果要保留不存在的目录),或将其更改为

if ! [ -d "$d" ]; then continue; fi
Run Code Online (Sandbox Code Playgroud)

请注意,符号链接规范化方法仅保证此函数添加的目录之间的唯一性。它也不处理边缘情况,例如挂载在两个位置的 NFS 目录或 Linux 绑定挂载。