0

使用此代码

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

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

在这种情况下,如果我只运行:

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'`

我可以得到包含/SDE/删除的路径;然而一个:仍然存在。sed我假设之后的命令应该删除它。当我一次运行整个命令时,根本没有任何东西被删除。导致路径不更新的语句有什么问题sed以及如何在删除路径变量后使sed命令删除冒号。:/SDE/

4

3 回答 3

2

问题是关闭反引号`在命令中的位置:

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

如果您使用推荐的$(...)符号,您会看到这相当于:

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

它将操作的输出通过管道export传输到sed,但是export是静默的。

采用:

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

我已经修复了逐字复制错误命令的答案。正如三人组在评论中指出的那样,我并不完全相信该awk解决方案,但问题是“代码出了什么问题”,答案是“反引号的位置”。该awk脚本确实处理删除 PATH 中任何位置的 PATH 元素;该sed脚本只是确保没有尾随:,因此不会在 PATH 末尾隐式使用当前目录。

另请参阅:我如何在 shell 脚本中操作 PATH 元素clnpath以及如何防止在其中复制 PATH 变量中csh的脚本——该脚本适用于像 Bourne、Korn、Bash shell 这样的 POSIX 式 shell,尽管有问题的主题。clnpath和这里使用的符号之间的一个区别是clnpath只删除完整的路径名;它不会尝试进行部分路径元素匹配:

export PATH=$(clnpath $PATH /opt/SDE/bin)

如果要删除的路径元素是/opt/SDE/bin. 请注意,clnpath可用于维护LD_LIBRARY_PATHCDPATHMANPATH任何其他类似路径的变量;awk当然,调用也可以。

我顺便注意到脚本中的/SDE/模式将删除;正则表达式中的斜杠与路径名中的斜杠无关。awk/opt/USDER/bin

于 2013-01-02T15:34:24.250 回答
0
$ PATH="$( awk -v rmv="/SDE/" -v path="$PATH" 'BEGIN{sub(rmv,"",path); gsub(/:+/,":",path); print path}' )"

以上是猜测,因为您没有提供示例输入或预期输出,因此它可能不是您想要的,但它是正确的方法。

于 2013-01-02T17:01:14.130 回答
0

就在 bash 中:

tmp=":$PATH"
[[ $tmp =~ :[^:]*/SDE/[^:]* ]] && tmp=${tmp/${BASH_REMATCH[0]}/}
PATH=${tmp#:}
于 2013-01-02T17:27:46.050 回答