如何从 shell 脚本中的 PATH 中删除第一个或多个段

如何从 shell 脚本中的 PATH 中删除第一个或多个段

我想通过 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尝试在您当前的环境中跑步脚本是不可能的。

相关内容