从 $PATH 变量中删除冗余路径

我已经在 $PATH 变量中定义了6次相同的路径。

我不是为了检查它是否有效。

如何删除副本?

$PATH 变量如下所示:

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
362598 次浏览

如何将这些重复路径添加到 PATH 变量?您必须已经编辑了 .文件中的一个。(.tcshrc.bashrc等,视乎你的特定系统/shell 而定)。修复它的方法是再次编辑文件并删除重复的路径。

如果您编辑任何文件,并且您必须以交互方式修改 PATH。在这种情况下,更改不会“坚持”,即如果您打开另一个 shell,或注销并重新登录,更改将自动消失。

请注意,还有一些系统范围的配置文件,但您不太可能修改这些文件,因此最有可能的情况是,您将更改您个人主目录中的文件(如果您想使这些更改永久化,一旦您设置了一组路径)

你只要执行:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

如果您希望永久地更改,可以将其添加到任何。Bashrc、 bash.bashrc、/etc/profile ——任何适合您的系统和用户需要的。

注意: 这是针对 Linux 的。我们会向新程序员解释清楚的。(,)不要试图 SET = these。

假设您的 shell 是 Bash,您可以使用

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

但正如 Levon 在另一个答案中所说的,一旦终止 shell,改变就会消失。您可能希望将 PATH设置为 ~/.bash_profile~/.bashrc

没有标准的工具来“编辑”$PATH的值(即“只有在文件夹不存在时才添加文件夹”或“删除该文件夹”)。

若要检查下次登录时的路径,请使用 telnet localhost(或 telnet 127.0.0.1)。然后它会询问你的用户名和密码。

这将为您提供一个新的登录 shell (即一个不从当前环境继承任何内容的全新的登录 shell)。

您可以在那里检查 $PATH的值并编辑您的 rc 文件,直到它是正确的。这对于查看在更改重要文件之后是否可以再次登录也很有用。

下面是清理 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,您还可以执行以下操作,比方说,如果您想从 PATH变量中删除目录 /home/wrong/dir/:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`

在 bash 中,您可以简单地使用 ${ var/find/place }

PATH=${PATH/%:\/home\/wrong\/dir\//}

或者在这种情况下(因为替换位是空的) :

PATH=${PATH%:\/home\/wrong\/dir\/}

我第一个来到这里,但去其他我认为会有一个 参数展开这样做。比 Sed 容易多了!.

如何用 Bash 中另一个变量的值替换变量中的占位符字符或单词?

对于一个简单的复制粘贴模板,我使用下面的 Perl 代码片段:

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`

这样,您就不需要转义替代操作符的斜杠。

Linux: 从 $PATH 变量中删除冗余路径

Linux From Scratch 有这个 在/etc/profile 中执行函数

# 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"
}

这些函数可以用来添加到路径中,这样就不会冗余地添加:

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提供要删除的目录路径——但是要记住,它必须完全匹配:

$ pathremove /home/username/anaconda3/bin

这将从路径中删除该目录的每个实例。

如果你想要路径中的目录,但是没有冗余,你可以只使用其他函数中的一个,例如-对于你的特定情况:

$ 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

以上这些是否适用于人类所知的所有贝壳?

我认为上面的方法至少可以在 shdashbash中使用。我会很惊讶地得知它不工作在 cshfish', orksh’。我怀疑它在 Windows 命令外壳或 Powershell 中是否能正常工作。

如果您使用的是 Python,那么下面这类命令应该执行直接要求的操作(即删除冗余路径) :

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )

一句话(回避多行问题) :

$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )

要删除早期的冗余路径,使用反向列表的索引并再次反向它:

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )

如果您只是想删除任何重复的路径,我使用这个脚本,因为我在使用多个 perl5/bin 路径时遇到了麻烦:

#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current shell gets the changes.


pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`


# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
if test -d $dir ; then
if test -z $PATH; then
PATH=$dir
else
PATH=$PATH:$dir
fi
fi
done
export PATH
# echo "After loop, PATH: $PATH"

我把它放在我的 ~/。最后的侧写。因为我几乎只使用 BASH,所以我还没有在其他 shell 中尝试过它。

  1. 就是 echo $PATH
  2. 将细节复制到文本编辑器中
  3. 删除不需要的条目
  4. PATH= # pass new list of entries

PATH = echo $PATH | sed 's/:/\n/g' | sort -u | sed ':a;N;$!ba;s/\n/:/g'

在终端执行代码下面我想删除 java 路径 PATH = $(tr:’n’< < “ $PATH”| grep-x-v”/usr/lib/java/bin”| 粘贴-sd:) 这里,解决方案

简单明了

下面是 这个流行答案的一个版本,附加说明。它要求您手动删除任何重复或不需要的 PATH 组件。虽然这不是非常优雅,但它可能往往更简单,也更容易上当受骗。

  1. echo $PATH > path.txt将当前路径写入文本文件
  2. 编辑 path.txt (例如使用 nano path.txt)
  3. export PATH=$(cat path.txt)将路径设置为文件的内容
  4. rm path.txt删除该文件

注意: 这些都是针对当前会话的,如果您想要永久地更改 PATH,则必须调整 bash 设置文件(例如 ~/)。巴希尔)。