Linux:从$ PATHvariables中删除多余的path
我在$ PATHvariables中定义了相同的path6次。
我没有注销来检查它是否工作。
我怎样才能删除重复?
$ PATHvariables如下所示:
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin
我将如何重置它只是
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
你只需执行:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
这将是当前会话,如果你想永久地将其添加到任何.bashrc,bash.bashrc,/ etc / profile – 任何符合你的系统和用户需求的。
如果你使用的是Bash,假如你想从PATH
variables中删除目录/home/wrong/dir/
,你也可以执行以下操作:
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
如果您需要在脚本运行之前从PATH
variables中删除path,请将其添加到脚本的开头:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
如果你需要,你可以在列表的前面重新添加它:
PATH=/home/user/bin:$PATH
或者你可以重新添加它在列表的末尾:
PATH=$PATH:/home/user/bin
这是一个清理PATH的单行代码
- 它不会打扰PATH的顺序,只是删除重复
- 对待:优雅地处理好PATH
- 没有使用特殊字符,所以不需要转义
-
使用
/bin/awk
所以即使在PATH被破坏的情况下也能正常工作export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";} {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1; printf(((NR==1)?"":":")$0)}}')";
在bash中,你只需要$ {var / find / replace}
PATH=${PATH/%:\/home\/wrong\/dir\//}
或者在这种情况下(因为replace位是空的)只是:
PATH=${PATH%:\/home\/wrong\/dir\/}
我来到这里,但去了其他的东西,因为我认为会有一个参数扩展来做到这一点。 比sed更容易!
如何用Bash中的另一个variables的值来replacevariables中的占位符字符或单词?
从头开始Linux 在/ etc / profile中有这个function
# Functions to help us manage paths. Second argument is the name of the # path variable to be modified (default: PATH) pathremove () { local IFS=':' local NEWPATH local DIR local PATHVARIABLE=${2:-PATH} for DIR in ${!PATHVARIABLE} ; do if [ "$DIR" != "$1" ] ; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done export $PATHVARIABLE="$NEWPATH" }
这是为了与这些function一起用于添加到path中,以便您不要冗余:
pathprepend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}" } pathappend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1" }
简单的用法是给pathremove
删除目录path – 但请记住,它必须完全匹配:
$ pathremove /home/username/anaconda3/bin
这将从您的path中删除该目录的每个实例。
如果你想要path中的目录,但没有冗余,你可以使用其他function之一,例如 – 对于你的具体情况:
$ pathprepend /usr/local/sbin $ pathappend /usr/local/bin $ pathappend /usr/sbin $ pathappend /usr/bin $ pathappend /sbin $ pathappend /bin $ pathappend /usr/games
但是,除非可读性是关心的问题,否则在这一点上,你最好只是做:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
假设你的shell是Bash,你可以设置path
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
但就像Levon在另一个答案中所说的那样,只要你终止shell,变化就会消失。 你可能想要在~/.bash_profile
或~/.bashrc
设置PATH
。
有没有标准的工具来“编辑” $PATH
的价值(即“只有当文件夹不存在时添加文件夹”或“删除此文件夹”)。
要检查下次login时的path,请使用telnet localhost
(或telnet 127.0.0.1
)。 然后它会询问您的用户名和密码。
这给你一个新的loginshell(即一个完全新的,不会从当前环境inheritance任何东西)。
您可以检查$PATH
的值,并编辑您的rc文件,直到它是正确的。 在对一个重要的文件进行更改后,看看是否可以再次login也是有用的。
你如何将这些重复path添加到PATHvariables? 你必须编辑你的一个.
文件。 ( .tcshrc
或.bashrc
等,取决于你的特定系统/ shell)。 修复它的方法是再次编辑文件并删除重复的path。
如果你没有编辑任何文件,而且你必须交互地修改PATH。 在这种情况下,更改不会“粘住”,即如果打开另一个shell,或者注销并重新login,更改将自动消失。
请注意,也有一些系统configuration文件,但是不太可能修改这些文件,所以很可能您将更改个人主目录中的文件(如果您希望一旦解决了一系列path问题,就将这些更改永久化)
对于一个简单的复制粘贴模板,我使用这个Perl代码片段:
PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`
这样你就不需要逃避替代操作符的斜线。