在 $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
,删除ARG
从 PATH
的末尾开始,最后将 ARG
添加到 PATH
之前。这种方法的好处是在 PATH
多次出现的情况下从 PATH
中删除 ARG
的所有实例,确保唯一的实例出现在函数执行后的开头。
为了避免通过盲目附加的常用技术对我的 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
,删除ARG
从 PATH
的末尾开始,最后将 ARG
添加到 PATH
之前。这种方法的好处是在 PATH
多次出现的情况下从 PATH
中删除 ARG
的所有实例,确保唯一的实例出现在函数执行后的开头。