在 $PATH 之前

prepending to the $PATH

为了避免通过盲目附加的常用技术对我的 PATH 进行临时设置 - 我开始破解一些代码以将项目添加到我的路径(例如 asdf 路径)。

pathprepend() {
  for ARG in "$@"
  do
   export PATH=${${PATH}/:$"ARG"://}
   export PATH=${${PATH}/:$"ARG"//}
   export PATH=${${PATH}/$"ARG"://}
   export PATH=$ARG:${PATH}
  done
}

它是这样调用的:pathprepend /usr/local/bin/usr/local/bin 被添加到 PATH 前面。该脚本还应该从其在 PATH 中的原始位置干净地删除 /usr/local/bin (确实如此,但不是干净地)(狡猾的正则表达式)。

谁能推荐一种更简洁的方法来做到这一点? shell (bash) 正则表达式支持有点受限。我宁愿拆分成一个数组并删除冗余元素,但想知道那个或我的实现的可移植性。我的感觉是,不是特别的。

如果你想将 PATH 拆分成一个数组,可以这样做:

IFS=: eval 'arr=($PATH)'

这将创建一个数组 arr,其元素是 PATH 字符串中以冒号分隔的元素。


但是,在我看来,这并不一定能让您更轻松地完成您想做的事情。这是我将如何添加到 PATH:

for ARG in "$@"
do
  while [[ $PATH =~ :$ARG: ]]
  do
    PATH=${PATH//:$ARG:/:}
  done
  PATH=${PATH#$ARG:}
  PATH=${PATH%:$ARG}
  export PATH=${ARG}:${PATH}
done

这使用bash替换从[=12=中间删除ARG,从[=12=开头删除ARG,删除ARGPATH 的末尾开始,最后将 ARG 添加到 PATH 之前。这种方法的好处是在 PATH 多次出现的情况下从 PATH 中删除 ARG 的所有实例,确保唯一的实例出现在函数执行后的开头。