如何在 zsh 中更改 PATH 变量?

问题描述

我想在 zsh 中更改我的 PATH 变量。

问题:我不明白 .zshrc 文件中我必须修改的位置。

通常,我会查找对 PATH 变量的赋值,并按照我希望的方式从头开始设置值(保持所有系统二进制文件目录不变)。

我的 .zshrc 文件中的第一行如下:

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="/Users/Sam/oh-my-zsh"

export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/13/bin

我的实际 PATH 变量是:

/Library/Frameworks/Python.framework/Versions/3.9/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Postgres.app/Contents/Versions/13/bin

删除python3.8所在目录,多余

我的问题:

  1. 我是否必须更改 .zshrc 文件中的第 2 行或第 7 行?
  2. 第 2 行被注释掉了……它是在终端开始处执行的吗?
  3. 我试图注释掉第 7 行。但是 postgres 目录仍然保留在我不理解的 PATH 变量中。

解决方法

.zshrc 位于主目录中。开头的点将其隐藏。在 ~ 目录中键入 ls -a 以查看它。要编辑只需像往常一样运行 vim、nvim 等。

nvim ~/.zshrc

这是 Neovim 的命令。对于您的编辑器,子 nvim 为正确的命令。

进入后,您只需添加与从命令行添加相同的导出命令。

export PATH=$PATH:/whatever/you/are/adding

编辑

删除路径变量:

  • 首先,运行命令:
echo $PATH

来自命令行。

  • 接下来,将输出复制到剪贴板。

  • 最后,在 .zshrc 文件的最后,添加以下内容:

export PATH=<paste-what-you-copied-here>

因为您没有在 $PATH 之后引用 =,这会将路径设置为与您粘贴的内容完全相同,不多也不少。在第一个示例中添加 $PATH: 只会将任何内容添加到已经存在的内容的末尾。

由于这使您可以访问路径数组中的每个项目,因此删除只是文字突出显示/选择以及您想要删除的任何内容的问题。

最后,请确保文件中只有一处您正在编辑 PATH。如果有多个,至少可以说结果会令人困惑。

也就是说,我相信脚本是从上到下运行的,所以只有最后提到的应该保留。在某些情况下,您可以利用这一点,但为此目的,一个就足够了。 XD

,

当你决定摆弄 .zshrc 中的 PATH 时要小心:由于文件是由每个交互式子 shell 处理的,因此每个子 shell 的 PATH 会越来越长,同一个目录出现在其中多次.如果您以后尝试查找与 PATH 相关的错误,这可能会变成一场噩梦。

由于您使用的是 zsh,您可以利用标量变量 PATH 在数组变量 path镜像,并且您可以要求 zsh 保持数组中的条目唯一。

因此,我要做的第一件事就是放一个

 typeset -aU path

在你的 .zshrc 中;这(由于镜像)也使 PATH 中的条目保持唯一。你可以把这个语句放在任何地方,但在我第一次分配给 PATHpath 之前,我有它以便于维护。

由您决定将新条目添加到 PATHpath 的确切位置。按变量中列出的顺序搜索条目。你必须问自己两个问题:

  • 某些目录是否位于网络共享上,您有时会在其中预期访问延迟(由于网络条件不佳)?这些目录最好显示在路径末尾附近。

  • 您的路径中是否有出现在多个目录中的命令?在这种情况下,路径搜索将始终只找到第一次出现。

最后别忘了,zsh 处理完文件后,您的更改才会被看到。因此,您可以在编辑文件后创建一个新的子 shell,或者手动获取 .zshrc

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...