pathmunge优于grep的优势是什么?

时间:2011-02-16 05:50:52

标签: bash duplicates

目前在bash shell中使用Solaris 10。 在查看脚本时,我注意到设置了pathmunge过程以避免PATH中文件夹路径的重复(它似乎还具有在PATH的开头或结尾添加必要文件夹的功能)。

除了能够追加/预先挂起(如果这是错误的术语,请原谅),为什么我们不能简单地做echo ${PATH} | grep <folder one wishes to add>

如果我唯一的意图是在PATH中有一个特定的文件夹(而不是真正关心开头或结尾),grep是否可以达到目的?

2 个答案:

答案 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/binecho ${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(是的,它仍在许多公司中使用)