加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从Bash的$PATH变量中删除路径最简单的方法是什么?

发布时间:2020-12-15 16:45:49 所属栏目:安全 来源:网络整理
导读:或者更一般地,如何从Bash环境变量中的冒号分隔的列表中删除项目? 我想我已经看到了一个简单的方法来做这些年前,使用更高级的形式的Bash变量扩展,但如果这样,我已经失去了它的轨道。快速搜索谷歌令人惊讶的相关结果很少,没有一个我称之为“简单”或“优
或者更一般地,如何从Bash环境变量中的冒号分隔的列表中删除项目?

我想我已经看到了一个简单的方法来做这些年前,使用更高级的形式的Bash变量扩展,但如果这样,我已经失去了它的轨道。快速搜索谷歌令人惊讶的相关结果很少,没有一个我称之为“简单”或“优雅”。例如,两种方法分别使用sed和awk:

PATH=$(echo $PATH | sed -e 's;:?/home/user/bin;;' -e 's;/home/user/bin:?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)

没有什么直接存在?有什么类似于Bash中的split()函数吗?

更新:
看来我需要为我的有意模糊的问题道歉;我对解决一个特定的用例不感兴趣,而不是激发好的讨论。幸运的是,我得到了!

这里有一些非常聪明的技巧。最后,我添加了以下三个功能到我的工具箱。魔法发生在path_remove中,这主要基于Martin York巧妙使用awk的RS变量。

path_append ()  { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove ()  { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }

在那里唯一真正的cr是使用sed去除尾结肠。考虑到马丁的解决方案是如何简单,但我很愿意与它一起生活!

相关问题:How do I manipulate $PATH elements in shell scripts?

分钟与awk:
# Strip all paths with SDE in them.
#
export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'`

编辑:它回复以下评论:

$ export a="/a/b/c/d/e:/a/b/c/d/g/k/i:/a/b/c/d/f:/a/b/c/g:/a/b/c/d/g/i"
$ echo ${a}
/a/b/c/d/e:/a/b/c/d/f:/a/b/c/g:/a/b/c/d/g/i

## Remove multiple (any directory with a: all of them)
$ echo ${a} | awk -v RS=: -v ORS=: '/a/ {next} {print}'
## Works fine all removed

## Remove multiple including last two: (any directory with g)
$ echo ${a} | awk -v RS=: -v ORS=: '/g/ {next} {print}'
/a/b/c/d/e:/a/b/c/d/f:
## Works fine: Again!

编辑响应安全问题:(这与问题无关)

export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}' | sed 's/:*$//')

通过删除最后一个条目,这将删除所有剩余的冒号,这将有效地添加。到你的路。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读