目前在bash shell中使用Solaris 10。 在查看脚本时,我注意到设置了pathmunge过程以避免PATH中文件夹路径的重复(它似乎还具有在PATH的开头或结尾添加必要文件夹的功能)。
除了能够追加/预先挂起(如果这是错误的术语,请原谅),为什么我们不能简单地做echo ${PATH} | grep <folder one wishes to add>
?
如果我唯一的意图是在PATH中有一个特定的文件夹(而不是真正关心开头或结尾),grep是否可以达到目的?
答案 0 :(得分:10)
pathmunge使用grep本身。 (好吧,egrep,确切地说。)
在Red Hat,CentOS等中,pathmunge在/etc/profile
:
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}
正如您所看到的,它比您的建议略微复杂,但并不多。你的提案不起作用的原因是如果没有分隔符,它将进行部分匹配。
所以如果我的路径是/usr/local/sbin:/usr/local/bin
,echo ${PATH} | grep /usr/local
将返回true,即使/ usr / local不在我的路径中。所以你需要匹配分隔符。但是如果你为:/usr/local:
grep,你也会失败,因为你永远不会匹配路径中的第一个或最后一个项,因为$ PATH既不以分隔符开始也不以分隔符结束。这就是使用egrep的原因。 (^ | :)匹配冒号或行的开头。 ($ | :)匹配冒号或行尾。
答案 1 :(得分:1)
我提出了对病态的进化,我现在使用了2年。
pathmunge() {
if [ -d "$1" ]; then
realpath / 2>&1 >/dev/null && path=$(realpath "$1") || path="$1"
# GNU bash, version 2.02.0(1)-release (sparc-sun-solaris2.6) ==> TOTAL incompatibility with [[ test ]]
[ -z "$PATH" ] && export PATH="$path:/bin:/usr/bin"
# SunOS 5.6 ==> (e)grep option "-q" not implemented !
/bin/echo "$PATH" | /bin/egrep -s "(^|:)$path($|:)" >/dev/null || {
[ "$2" == "after" ] && export PATH="$PATH:$path" || export PATH="$path:$PATH"
}
fi
}
1)它检查目录的有效性,以获得最低的性能成本
2)它也使用realpath,并且还测试命令realpath。在将路径添加到$ PATH
之前重新路径3)在SunOS 5.6上无法使用egrep -q(是的,它仍在许多公司中使用)