问题描述
我想在 zsh 中更改我的 PATH 变量。
通常,我会查找对 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
我的问题:
- 我是否必须更改 .zshrc 文件中的第 2 行或第 7 行?
- 第 2 行被注释掉了……它是在终端开始处执行的吗?
- 我试图注释掉第 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 中的条目保持唯一。你可以把这个语句放在任何地方,但在我第一次分配给 PATH
或 path
之前,我有它以便于维护。
由您决定将新条目添加到 PATH
或 path
的确切位置。按变量中列出的顺序搜索条目。你必须问自己两个问题:
-
某些目录是否位于网络共享上,您有时会在其中预期访问延迟(由于网络条件不佳)?这些目录最好显示在路径末尾附近。
-
您的路径中是否有出现在多个目录中的命令?在这种情况下,路径搜索将始终只找到第一次出现。
最后别忘了,zsh 处理完文件后,您的更改才会被看到。因此,您可以在编辑文件后创建一个新的子 shell,或者手动获取 .zshrc
。