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

cha*_*dry 122 linux bash path environment-variables sh

我在$ 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
Run Code Online (Sandbox Code Playgroud)

我该怎么把它重置为

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

hov*_*yan 116

你只需执行:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

这将是当前会话,如果你想永久改变它添加到任何.bashrc,bash.bashrc,/ etc/profile - 任何适合您的系统和用户需求.


suf*_*waz 64

如果您正在使用Bash,那么如果您想要/home/wrong/dir/PATH变量中删除目录,也可以执行以下操作:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
Run Code Online (Sandbox Code Playgroud)

  • Protip:你可以在sed表达式中使用不同的deliminator来避免\ /转义:`PATH = $(echo $ PATH | sed -e's |:/ home/wrong/dir | $ ||')` (11认同)
  • 当我想立即拥有新的PATH并且不想退出当前终端时,此技巧会有所帮助.但是,为了避免搞乱,应该在将其分配给PATH生成命令(即`echo $ PATH | sed -e的/:\/home\/ wrong\/ dir\/ $ //'`)之前进行实验.路径. (4认同)
  • 当要删除的路径恰好是`$ PATH`中的第一个路径时,这将不起作用.使用这个:`PATH = $(echo:$ PATH:| sed -e's,:/ home/wrong/dir:,:,g'-e's/^://'-e's /: $ //')` (2认同)

Aar*_*all 11

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"
}
Run Code Online (Sandbox Code Playgroud)

这是为了与这些函数一起使用以添加到路径,因此您不会冗余地执行此操作:

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"
}
Run Code Online (Sandbox Code Playgroud)

简单的用法是只提供pathremove要删除的目录路径 - 但请记住它必须完全匹配:

$ pathremove /home/username/anaconda3/bin
Run Code Online (Sandbox Code Playgroud)

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

如果您想要路径中的目录,但没有冗余,您可以使用其他功能之一,例如 - 对于您的具体情况:

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Run Code Online (Sandbox Code Playgroud)

但是,除非可读性是关注点,否则此时您最好只做:

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)

上述工作是否适用于人类已知的所有壳体?

我会假设上面的工作中sh,dash以及bash至少.我会惊讶地发现它不起作用csh,fish', orksh`.我怀疑它在Windows命令shell或Powershell中是否有效.

如果您有Python,则以下类型的命令应该执行直接询问的操作(即删除冗余路径):

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

单行(避开多行问题):

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

以上删除了以后的冗余路径.要删除早期的冗余路径,请使用反向列表的索引并再次反转:

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


Gre*_*Fox 8

这是一个清除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)}}')";
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果您没有安装awk它会清理您的路径,我建议您使用echo $ PATH之前将路径复制到txt文件 (2认同)

ckw*_*aba 6

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