如何使用终端命令从系统路径(`$PATH`)中移除一个路径?

如何使用终端命令从系统路径(`$PATH`)中移除一个路径?

27在您当前的shell(gnome-terminal的当前会话)中,您可以使用以下方法来实现:

export PATH=${PATH%:/home/avinash/Desktop/raj}

总的来说:

${string%substring}

从$string的后面删除最短匹配的$substring。

更多信息请查看字符串操作。

- Radu Rădeanu回答链接24运行export PATH=$PATH:/...不会在整个系统中设置你的PATH。它只是一个shell变量。启动一个新的shell,BOOM,它就消失了。显然,如果你将其添加到~/.bashrc(或其他环境引导文件)中,你将不得不撤销该更改,但这似乎不是你在这里遇到的问题。

如果你不想启动一个新的shell,你可以通过手动删除来设置它:

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

- Oli回答链接6如果你将export语句放在任何shell初始化文件中,比如~/.bashrc,你可以在终端中使用以下命令:

#remove the export statement from the file.

sed -i 's#export PATH=$PATH:/home/avinash/Desktop/raj##g' ~/.bashrc

#source ~/.bashrc

. ~/.bashrc

它将从路径中删除文件夹。

如果您已经从终端导出了路径

只要您在该shell中,文件夹就会存在于路径中。要覆盖路径,您必须分配新的路径。正如oli在其他答案中已经提到的那样。

您可以使用以下命令设置旧路径

export PATH=`echo ${PATH/\:\/home\/avinash\/Desktop\/raj/}`

或者,简单点说

export PATH=${PATH/':/home/avinash/Desktop/raj'/}

这是子字符串替换。

${string/substring/replacement}

- sourav c.回答链接4如果你想将其用作命令,这里有一个小脚本:

#!/bin/bash

# This script removes folder from PATH variable

# Folders to remove reading as arguments

if [ $# -lt 1 ]; then

echo "You should give at least one argument"

echo "For example"

echo "$0 /usr/local/bin"

else

FOLDERS_TO_REMOVE=`echo $@ | sed 's/ /|/g'`

echo "You actually PATH variable is:"

echo $PATH

echo "###"

PATH=$( echo ${PATH} | tr -s ":" "\n" | grep -vwE "(${FOLDERS_TO_REMOVE})" | tr -s "\n" ":" | sed "s/:$//" )

echo "Now you need to run"

echo "export PATH=$PATH"

fi

将其命名为unexport,并将其添加到您的PATH中。

用法:

unexport /usr/local/bin /bin /sbin

此脚本不会更改您实际的PATH。如果您希望脚本这样做,您应该更改最后一行。将echo "export PATH=$PATH"替换为export PATH=$PATH

- c0rp回答链接3一个不正当的技巧是

export PATH="$( echo $PATH| tr : '\n' |grep -v raj | paste -s -d: )"

将您的PATH中的每个目录使用tr命令分行分隔开来。

使用grep -v删除您不想要的内容(路径匹配"raj"),

然后使用paste将其合并回一个长的以":"分隔的字符串。

如果PATH中的任何目录包含:或换行符,这可能无法正常工作。

如果您发现自己经常这样做,请考虑将其制作成一个函数并保存在您的shell配置文件中(例如.bashrc、.zshrc)。

# use like: rminpath "raj"

rminpath(){ export PATH="$( echo $PATH| tr : '\n' |grep -v "$1" | paste -sd: )"; }

- Will回答链接1export PATH=$PATH:/home/avinash/Desktop/raj(在这里,您已将文件添加到路径变量中。)

echo $PATH

如果您执行此命令,输出如下:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/avinash/Desktop/raj

怎样从路径中移除它?

只需执行即可。

$ export PATH=${PATH/'/home/avinash/Desktop/raj'/}

这是一个字符串替换的概念。

$ export PATH=${string/substring/replacement}

- Shalom Alexander回答链接0shell内置命令export并不确定变量是否已设置,它确定变量及其值是否在子进程中也被设置。

无论变量是否被导出,改变变量的值都不会影响父进程或更高级别的进程,因此除非使用source运行脚本,否则在脚本中对变量的更改没有效果。

一个shell函数:

function trimpath {

PATH=${PATH%:*}

}

将会去掉PATH变量的最后一个组件。其"export"状态不受影响。

- David Ledger回答链接0我只是简单地使用sed,就像这样

PATH=$(sed "s/\/home\/avinash\/Desktop\/raj//" <<< $PATH)

这应该能解决问题。

简单解释一下这个工作原理:

首先,我们定义变量值设置为PATH=,然后我们必须使用$(command)将下一个命令的结果值作为该变量的值,接着是SED命令sed "s///",/将成为该命令的分隔符,默认情况下我们使用/,但你可以设置任何字符,如-或_。第一个s用于替换,然后是第一个分隔符,接着是要查找的表达式,然后是另一个分隔符,再接着是要替换第一个表达式(你要查找的那个)的表达式,最后是另一个分隔符,并且你可以使用一些参数,如g,进行全局替换。反斜杠\是转义字符,用于让sed理解下一个/是字面意义上的字符而不是分隔符。三个小于号<<<用于将变量传递给sed命令。

- Gabriel de Lima回答链接0declare -x PATH="/desired/path/you_want" 如果我没记错的话,这将会更新你想要的内容,并且完全取决于你的意愿。[确保以root用户和你想要影响的目标用户身份运行] 为了确保,之后运行ENV命令来确认$PATH是否被有效地修改成你想要的样子。(这适用于修改当你运行'/usr/bin/env'时得到的任何输出。虽然我不知道它是否是永久性的。在这方面,按照上述说明修改~/.bashrc文件使其生效)

- Jake Baldwin回答链接