![如何从 shell 脚本中的 PATH 中删除第一个或多个段](https://linux22.com/image/145547/%E5%A6%82%E4%BD%95%E4%BB%8E%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%20PATH%20%E4%B8%AD%E5%88%A0%E9%99%A4%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%88%96%E5%A4%9A%E4%B8%AA%E6%AE%B5.png)
我想通过 sh 脚本从 PATH 中删除 CUDA 目录。目录通过以下方式显示echo $PATH
/usr/local/cuda-9.0/bin:/usr/sbin:/usr/bin:
我只想要:
/usr/sbin:/usr/bin:
我的脚本没有改变任何东西,但它在终端中改变了(当我这样做时,该脚本将自动执行conda deactivate
):
export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')
有人可以告诉我原因并以一种优雅的方式纠正它吗?
答案1
export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')
或者更正确的版本:
export PATH="$(printf '%s\n' "$PATH" | sed 's|/usr/local/cuda-9\.0/bin||')"
$PATH
通过删除第一次出现的 来更新调用该命令的 shell 的变量内容/usr/local/cuda-9.0/bin
。例如,它会将 a 更改/bin:/opt/usr/local/cuda-9.0/bin/v2:/usr/local/cuda-9.0/bin
为/bin:/opt/v2:/usr/local/cuda-9.0/bin
您不想要的。
要删除完整元素,您可以执行以下操作:
export PATH="$(
printf ':%s:\n' "$PATH" |
sed '
:1
s|:/usr/local/cuda-9\.0/bin:|:|g; t1
s|^:||; s|:$|'
)"
或者使用 zsh:
path=("${path[@]:#/usr/local/cuda-9.0/bin}")
请注意,如果$PATH
最初仅包含/usr/local/cuda-9.0/bin
,则最终结果将为空$PATH
。而空的$PATH
意思是在当前目录中搜索可执行文件这不是你想要的。如果这是可能的,那么您可能想要制作$PATH
类似的东西/inexistent/to/disable/PATH/lookup
。
请注意,无论如何,它只会更改$PATH
运行该代码的 shell 的变量。如果您希望它影响$PATH
调用该脚本的 shell 的变量,您需要该 shell来源(与.
orsource
命令一样)该deactivate
脚本,或者制作deactivate
一个功能那个壳的。
或者,您也可以使用deactivate
脚本输出从中删除这些条目所需的 shell 代码$PATH
(例如通过export -p PATH
在修改后添加)并确保将其调用为:
eval "$(deactivate)"
在您希望从其中删除该条目的 shell 中$PATH
。
就像是:
#! /bin/zsh -
path=("${path[@]:#/usr/local/cuda-9.0/bin}")
export -p PATH
答案2
你可以简单地export PATH=/usr/sbin:/usr/bin
。但你的方法已经有效:
$ PATH=/usr/local/cuda-9.0/bin:/usr/sbin:/usr/bin:
$ export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')
$ echo $PATH
:/usr/sbin:/usr/bin:
正在尝试设置PATH
尝试在您当前的环境中跑步脚本是不可能的。