Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从$PATH变量中删除冗余路径_Linux_Bash_Path_Environment Variables_Sh - Fatal编程技术网

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

Linux 从$PATH变量中删除冗余路径,linux,bash,path,environment-variables,sh,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/flac

我在$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

如何将这些重复路径添加到PATH变量中?您必须编辑了一个
文件。(
.tcshrc
.bashrc
等,具体取决于您的特定系统/外壳)。解决方法是再次编辑文件并删除重复路径

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

请注意,也有一些系统范围的配置文件,但您不太可能修改这些文件,因此很可能您将更改个人主目录中的文件(如果您希望在确定一组路径后使这些更改永久化)

您只需执行:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
如果您想永久性地更改当前会话,请将其添加到any.bashrc、bash.bashrc、/etc/profile中—任何适合您的系统和用户需要的内容


注意:这是针对Linux的。我们将向新的编码人员说明这一点。(`,')不要试图设置=这些。

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

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

但正如列文在另一个回答中所说,一旦你终止外壳,改变就会消失。您可能想在
~/.bash_profile
~/.bashrc
中设置
路径
没有标准工具可以“编辑”
$PATH
的值(即“仅当文件夹不存在时添加文件夹”或“删除此文件夹”)

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

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


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

下面是一个清理路径的单行代码

  • 它不会干扰路径的顺序,只会删除重复项
  • 款待:优雅地清空路径
  • 没有使用特殊字符,因此不需要转义
  • 使用
    /bin/awk
    ,因此即使路径中断,它也能工作

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";
    

如果您使用的是Bash,如果您想从
路径
变量中删除目录
/home/error/dir/
,也可以执行以下操作:

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

在bash中,您只需${var/find/replace}

PATH=${PATH/%:\/home\/wrong\/dir\//}
或者在这种情况下(替换位为空),只需:

我先来这里,但去了其他地方,因为我认为会有一个新的方法来做这件事。比sed!容易


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

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`
这样,您就不需要为替换操作符跳过斜杠

Linux:从$PATH变量中删除冗余路径 Linux从头开始就有这样的功能

这将与这些函数一起用于添加到路径,这样您就不会冗余地执行此操作:

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
在人类已知的所有壳中,上述方法都有效吗? 我认为以上内容至少适用于
sh
dash
、和
bash
。我会惊讶地发现它在
csh
fish'或
ksh`中不起作用。我怀疑它能否在Windows命令shell或Powershell中工作

如果您使用Python,则以下命令应执行直接请求的操作(即删除冗余路径):

一行程序(避开多行问题):

上述操作将删除以后的冗余路径。若要删除以前的冗余路径,请使用已反转列表的索引,然后再次将其反转:

$ 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中尝试过它

  • 只需
    echo$PATH
  • 将详细信息复制到文本编辑器中
  • 删除不需要的条目
  • PATH=#传递新条目列表

  • PATH=
    echo$PATH | sed's/:/\n/g'| sort-u | sed':a;N、 美元!文学士;s/\n/:/g'

    是的,我在bash.bashrc中永久设置了它们。那么命令应该是这样的吗
    echo'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games'>>~/.bashrc
    问题在于,根据您的操作系统,会执行一系列配置。您需要确保以后不会覆盖PATH变量。(对于一个用户)最简单的方法是在用户的personal.bashrc中覆盖它,它通常位于用户的主目录中。您的命令将路径设置为-$PATH(PATH的当前值)+字符串/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/gam‌​锿。如果只需要字符串,请从命令中删除$PATH+分号(:)。无论您是使用echo还是手工编辑文件~/.bashrc,都无关紧要。bash.bashrc文件位于/etc文件夹中。但它不显示$PATH变量,因此我不确定在您的第一条评论中编辑它的位置
    $ 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)))
    " )
    
    #!/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"