使用此代码
What is the most elegant way to remove a path from the $PATH variable in Bash?
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/
。
答案 0 :(得分: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/:*$//')
我已经修复了answer,从中逐字复制了错误的命令。正如tripleee在评论中所指出的那样,我并不完全相信awk
解决方案,但问题是“代码出了什么问题”,答案是“放置后引号的位置” ”。 awk
脚本确实处理PATH中任何位置的PATH元素; sed
脚本只是确保没有尾随:
,因此在PATH末尾没有隐式使用当前目录。
另请参阅:How do I manipulate PATH elements in shell scripts和How to keep from duplicating PATH variable in csh
上的clnpath
脚本 - 该脚本适用于Bourne,Korn,Bash shell之类的POSIX-shell,尽管有问题的主题。 clnpath
与此处使用的符号之间的一个区别是clnpath
仅删除完整路径名;它不会尝试进行部分路径元素匹配:
export PATH=$(clnpath $PATH /opt/SDE/bin)
如果要删除的路径元素是/opt/SDE/bin
。请注意,clnpath
可用于维护LD_LIBRARY_PATH
,CDPATH
,MANPATH
以及任何其他类似路径的变量;当然,awk
调用也可以。
我顺便提一下,/SDE/
脚本中的awk
模式会删除/opt/USDER/bin
;正则表达式中的斜杠与路径名中的斜杠无关。
答案 1 :(得分:0)
$ PATH="$( awk -v rmv="/SDE/" -v path="$PATH" 'BEGIN{sub(rmv,"",path); gsub(/:+/,":",path); print path}' )"
以上是猜测,因为你没有提供样本输入或预期输出,所以它可能不是你想要的,但这是正确的方法。
答案 2 :(得分:0)
就在bash:
tmp=":$PATH"
[[ $tmp =~ :[^:]*/SDE/[^:]* ]] && tmp=${tmp/${BASH_REMATCH[0]}/}
PATH=${tmp#:}