首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pathmunge比grep有什么优势?

问pathmunge比grep有什么优势?
EN

Stack Overflow用户
提问于 2011-02-16 13:50:52
回答 2查看 6.6K关注 0票数 8

目前在bash shell中的Solaris10上工作。在查看脚本时,我注意到为避免路径中的文件夹路径重复而设置的pathmunge过程(它似乎还具有在路径的开头或结尾添加必要的文件夹的功能)。

除了能够将/pre-pend(如果这是错误的术语,请原谅)附加到路径之外,为什么我们不能简单地执行echo ${PATH} | grep <folder one wishes to add>?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 14:06:18

在2012年之前,pathmunge一直使用grep本身。(准确地说,是egrep。)

在Red、CentOS等中,路径消息是在/etc/profile中定义的

代码语言:javascript
复制
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内置的模式匹配功能,效率稍高一些。

票数 10
EN

Stack Overflow用户

发布于 2014-10-03 10:16:44

我建议对pathmunge进行改进,我现在已经使用了2年。

代码语言:javascript
复制
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 (是的,许多公司仍在使用)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5012958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档