ChatGPT解决这个技术问题 Extra ChatGPT

在 ZSH 的 PATH 变量中添加新条目

我正在使用 zsh 终端,并且正在尝试向 PATH 变量添加一个新条目 (/home/david/pear/bin)。我在 ~/.zshrc 文件中没有看到对 PATH 变量的引用,但执行 echo $PATH 会返回:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

所以我知道路径变量被设置在某个地方。为 zsh 终端设置/修改的 PATH 变量在哪里?

在我看来,PATH 应该在 .zshenv 中操作,而不是在 .zshrc 中...
如果其他人对@Rmano 关于使用 '.zshenv' 的指针(就像我一样)感到好奇,这里有 link 的详细讨论。

T
Trevor Hickey

实际上,使用 ZSH 允许您使用环境变量的特殊映射。所以你可以简单地做:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

对我来说,这是一个非常简洁的功能,可以传播到其他变量。例子:

typeset -T LD_LIBRARY_PATH ld_library_path :

不错的答案。在我的例子中,~/.zshrc 源自 .profile,并覆盖了 .profile 中的所有内容。花了一段时间拉我的头发才弄明白。
除非您要附加多个元素,否则 append case 不需要括号。它通常也不需要引号。所以简单,简短的追加方法是
@SuperUberDuper,您应该了解,几乎所有 unix shell 都只是读取启动文件,这与您以交互方式将其键入 shell 几乎相同。关于“rc”文件,您可能会发现 this question 的有趣答案
可以使用 -x 避免显式导出,并在带有 -U 的变量中仅保留唯一值,默认情况下假定冒号,因此可以是:typeset -TUx PATH path
@DanielSpringer,不。如果您希望在这些术语中使用它:path=(...)(内部不引用 $path$PATH)分配、path=(... $path) 前置和 path+(...) 附加。
M
Michael Lang

在这里,将此行添加到 .zshrc

export PATH=/home/david/pear/bin:$PATH

编辑:这确实有效,但上面的 ony's answer 更好,因为它利用了 ZSH 为 $PATH 等变量提供的结构化接口。这种方法是 bash 的标准方法,但据我所知,当 ZSH 提供更好的替代方案时,没有理由使用它。


哈哈算了,我虽然这只是一个控制台命令,但将那行添加到 .zshrc 就可以了。非常感谢!
我的 .zshrc 已经有一行用于导出 PATH,因此我将其替换为修改后的行。
我必须删除条目周围的双引号,即 PATH="/home/david/pear/bin:/usr/bin:etc"PATH=/home/david/pear/bin:/usr/bin:etc 以使其保留在 zshrc 中。
@taco,你可以使用 $HOME
@DanielSpringer:是的。当您打开一个 shell 时,它从启动它的父进程继承 PATH,然后当它运行 .zshrc(或 .bashrc 或其他)时,这就是让您向该路径添加额外内容的原因。
M
Micah Elliott

您可以以最小的方式追加到您的 PATH。除非您附加多个元素,否则不需要括号。它通常也不需要引号。所以简单、简短的追加方法是:

path+=/some/new/bin/dir

这种小写语法将 path 用作 数组,但也会影响其对应的大写伙伴 PATH(通过 typeset “绑定”到它)。

(请注意,不需要/不需要 : 作为分隔符。)

常见的交互用法

然后测试新脚本/可执行文件的常见模式变为:

path+=$PWD/.
# or
path+=$PWD/bin

常见配置用法

您可以在 .zshrc 周围添加路径设置(如上),它自然会导致前面列出的设置优先(尽管您可能偶尔仍想使用“前置”表单 path=(/some/new/bin/dir $path) )。

相关花絮

以这种方式处理 path(作为数组)还意味着:无需执行 rehash 即可找到新路径的命令。

另请查看将 vared path 作为编辑 path(和其他内容)的动态方式。

对于这个问题,您可能只对 path 感兴趣,但由于我们讨论的是导出和数组,请注意 arrays generally cannot be exported.

您甚至可以防止 PATH 接收重复条目(请参阅 thisthis):

typeset -U path

PATH 预填充

您的路径中已经有一些条目的原因是由于您的系统外壳文件为您设置了路径。这在其他几篇文章中有介绍:

为什么以及在哪里设置 $PATH 环境变量?

$PATH 的来源在哪里?我在 .zshrc 中找不到它


它不应该是'path+=:/foo/bar'吗? (带冒号)
@andrewlorien 我用关于冒号分隔符的详细信息更新了答案。
请注意,如果路径后有注释,那么我们确实需要引号,例如 path+='my/path' # for fun。如果你有空格很明显,但如果你有评论就不那么明显了。
“(请注意,不需要/不需要 : 作为分隔符。)”这仅适用于小写 pathPATH 需要前面的 :,如下 .zshrc PATH+=:/Users/path/to/my/folder
对于 ZSH 将 $PATH 解释为一个数组并使其唯一,我相信正确的方法是 typeset -aU path
S
Siva Praveen

一个班轮,无需打开 ~/.zshrc 文件

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

或者

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

要查看效果,请在同一标签中执行 source ~/.zshrc 或打开一个新标签


使用 Zsh shell 在 OSX 上完美工作。
像魅力一样工作!
s
saneryee

添加路径 ~/.zshrc sudo vi ~/.zshrc 添加新路径 export PATH="$PATH:[NEW_DIRECTORY]/bin" 更新 ~/.zshrc 保存 ~/.zshrc 源 ~/.zshrc 检查 PATH echo $PATH


这是 Bash 方式。
行之有效的方法
D
Dimitar

选项 1:将此行添加到 ~/.zshrc:

export "PATH=$HOME/pear/bin:$PATH"

之后,您需要运行 source ~/.zshrc 以使您的更改生效或关闭此窗口并打开一个新窗口

选项 2:在终端控制台内执行它以仅将此路径添加到当前终端窗口会话。当您关闭窗口/会话时,它将丢失。


您能否详细说明此答案与 the same answer posted 5 years ago 有何不同?
在这个答案中,并不是说你必须将这行代码添加到文件中,如果你只是这样运行它,它只会在当前窗口中改变,这在原始答案中没有解释
A
Aurora

对我来说 PATH=$PATH:/path/to/file/bin 然后 export PATH 工作。检查 echo $PATH 。其他解决方案正在临时添加路径。


n
nicolas

要验证您的新目录是否已正确添加,您可以使用

print -l $path

由于它的类型已知是一个数组


M
MNassar

如果您使用的是 macOS(我使用的是 Monterey 12.3.1),那么您可能会像我比喻的那样一直在扯头发。这些说明首先在终端会话中对我有用,但无论我对导出做了什么,我都无法让它持续存在。此外,我在任何地方都找不到 .zshrc 。

事实证明,苹果的做法不同。您需要编辑的文件是 etc/paths。您可以简单地 sudo nano /etc/paths 并在新行中添加您的路径。然后只需重新启动终端并瞧。


j
jaycer

我在 Monterey 12.4 上,我可以更改路径的唯一方法是使用辅助函数。在 nano 中编辑文本文件确实很笨拙

# append
path+=('/foo/bar/yourpath')
# export to sub-processes 
export PATH

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅