如何从 Zsh 中的 $PATH 中删除路径并将其添加到开头而不重复?

Posted

技术标签:

【中文标题】如何从 Zsh 中的 $PATH 中删除路径并将其添加到开头而不重复?【英文标题】:How can I remove a path from $PATH in Zsh and add it to the beginning without duplication? 【发布时间】:2013-04-17 01:41:25 【问题描述】:

我有:

PATH=/bar:/foo

我想要:

PATH=/foo:/bar

我不想要:

PATH=/foo:/bar:foo

所以我在想,给定默认路径是PATH=/bar,我可以修改$path(即$PATH作为关联数组):

function prepend_to_path() 
  unset $path[(r)$1]
  path=($1 $path)


prepend_to_path /foo

但这抱怨:

prepend_to_path:unset:1: not enough arguments

已经太久了,我什至不记得(r) 的用途,但没有它 (unset $path[$1]) 我明白了:

prepend_to_path:1: bad math expression: operand expected at `/home/nerd...'

我做错了什么?

【问题讨论】:

【参考方案1】:

您可以将函数的主体替换为:

path=($1 $(@)path:#$1)

相关回答:https://***.com/a/3435429/1107999

【讨论】:

【参考方案2】:

这也有效(可以说,几个月后你再看它时会更容易阅读):

prepend_to_path () 
  path[1,0]=$1 
  typeset -U path

typeset -U 将自动对数组进行去重,只保留每个元素的第一次出现。

既然export等价于typeset -gx,你也可以export -U path一石二鸟。

编辑: typeset -U 只需应用于特定数组一次,因此可以在 shell 启动的某个地方执行此操作,并从上面的函数中删除该行。

【讨论】:

以上是关于如何从 Zsh 中的 $PATH 中删除路径并将其添加到开头而不重复?的主要内容,如果未能解决你的问题,请参考以下文章

更改以从环境变量 PATH 中删除路径

无法检测到 shell 配置文件 (zsh - ~/.zshrc)

如何从列表中的项目中删除标点符号并将其另存为列表中的单独项目?

Lua从请求uri中删除文件路径中的文件夹

删除功能仍然可用

如何获取 ADLS Gen2 文件的最后修改日期并将其保存到 python 中的 csv