目前在bash shell中的Solaris10上工作。在查看脚本时,我注意到为避免路径中的文件夹路径重复而设置的pathmunge过程(它似乎还具有在路径的开头或结尾添加必要的文件夹的功能)。
除了能够将/pre-pend(如果这是错误的术语,请原谅)附加到路径之外,为什么我们不能简单地执行echo ${PATH} | grep <folder one wishes to add>?
如果我的唯一意图是在路径中有一个特定的文件夹(而不是真正关心开头或结尾),grep能达到这个目的吗?
发布于 2011-02-16 14:06:18
在2012年之前,pathmunge一直使用grep本身。(准确地说,是egrep。)
在Red、CentOS等中,路径消息是在/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的原因。(^|:)匹配冒号或行首。($|:)匹配冒号或行尾。
现代版本的pathmunge使用shell内置的模式匹配功能,效率稍高一些。
发布于 2014-10-03 10:16:44
我建议对pathmunge进行改进,我现在已经使用了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 (是的,许多公司仍在使用)
https://stackoverflow.com/questions/5012958
复制相似问题