在ZSH中将新条目添加到PATH变量

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

我知道 path 变量在某个地方被设置了。在 zsh 终端中,PATH 变量是在哪里被设置/修改的?


15
我认为,对于 PATH 的操作应该在 .zshenv 中进行,而不是在 .zshrc 中进行… - Rmano
12
如果还有其他人对@Rmano关于使用'.zshenv'的方法感兴趣,可以参考这个链接中的详细讨论。链接为https://unix.stackexchange.com/questions/71253/what-should-shouldnt-go-in-zshenv-zshrc-zlogin-zprofile-zlogout?newreg=741ab675789d4b1ba96862d40c2bb2d7 - YCode
13个回答

586

实际上,使用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 :

35
好的回答。在我的情况下,~/.zshrc.profile 之后被引用,并覆盖了 .profile 中的所有内容。我花了一段时间才想明白这个问题。 - Khanh Nguyen
2
追加操作不需要括号,除非你要追加多个元素。通常也不需要引号。因此,简单、简洁的追加方式是: - Micah Elliott
13
使用-x可以避免显式导出变量,使用-U可以仅保留变量中的唯一值,默认情况下使用冒号,因此可以这样写:typeset -TUx PATH path - Grief
3
我看到了pathPATH的使用,它们是两个不同的实体吗? - CousinCocaine
2
如果我想在单引号内使用$HOME怎么办? path +=('$HOME/etc/etc') 似乎不起作用。 - Rotkiv
显示剩余15条评论

460

在这里,将这行代码添加到.zshrc文件中:

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

编辑:这个确实可以工作,但是上面ony的答案更好,因为它利用了ZSH提供的类似$PATH变量的结构化接口。这种方法在bash中很常见,但据我所知,在ZSH提供更好的替代方案时没有理由使用它。


37
哈哈算了,我以为那只是一个控制台命令,但将那行代码添加到.zshrc文件中就解决了问题。非常感谢! - David Barreto
1
我的 .zshrc 文件已经有一行用于导出 PATH,所以我用修改后的替换了它。 - Zack Huston
6
我必须去掉条目周围的双引号,即将PATH="/home/david/pear/bin:/usr/bin:etc"更改为PATH=/home/david/pear/bin:/usr/bin:etc ,这样它才能留在zshrc中。 - a7omiton
4
@taco,你可以使用 $HOME。(翻译:@taco, you can use $HOME) - mencargo
1
它将擦除所有旧的PATH,尝试使用export PATH=$PATH:/path/to/dir - sstruct
显示剩余3条评论

113

您可以以最小的方式添加到您的PATH中,除非您要添加多个元素,否则不需要使用括号。通常也不需要加引号。因此,添加的简单而简短的方法是:

path+=/some/new/bin/dir

这个小写语法使用 path 作为一个数组,但是它也影响到它的大写伴侣等价物 PATH(通过 typeset 绑定)。

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

常见的交互式用法

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

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

常见的配置用法

您可以像上面那样在.zshrc中散布路径设置,它会自然地导致较早列出的设置具有优先权(尽管您偶尔仍可能希望使用“prepend”形式path=(/some/new/bin/dir $path))。

相关小贴士

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

还可以查看vared path作为动态编辑path(和其他内容)的方式。

您可能只对此问题的path感兴趣,但由于我们正在谈论导出和数组,请注意通常无法导出数组。

您甚至可以防止PATH重复条目(参考此处此处):

typeset -U path

路径预填充

你的路径已经有一些条目是由你的系统shell文件为你设置路径所致。这在其他几篇帖子中都有涉及:


1
@andrewlorien 我更新了答案,并提供了有关冒号分隔符的详细信息。 - Micah Elliott
请注意,如果路径后面有注释,则需要使用引号,例如 path+='my/path' # for fun。如果路径中有空格的话很显然要用引号,但如果有注释就不那么明显了。 - Franklin Yu
2
(请注意,不需要或不想要使用冒号作为分隔符。)这仅适用于小写的“path”。在.zshrc中,需要在“PATH”之前加上“:”,如下所示:PATH+=:/Users/path/to/my/folder - Emmett R.
我经常使用 exec zsh,因为我使用 oh-my-zsh 的插件。每次执行时路径都会变长。我应该定期“默认”路径吗? - Timo
1
为了让ZSH将$PATH解释为一个数组并使其唯一,我认为正确的方法是 typeset -aU path - C. Sederqvist

72

不用打开~/.zshrc文件即可完成一行命令

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc
echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc
为了看到效果,在同一个选项卡中执行source ~/.zshrc 或打开一个新选项卡。

1
在OSX上使用Zsh shell完美运行。 - Stryker
1
运行得非常顺利! - Akbarsha
完美!在MacOS M2上。 - Hugo Laguna
谢谢!一行解决方案似乎完美无缺。 - undefined

38
  1. 新增了到~/.zshrc的路径

    sudo vi ~/.zshrc

    添加新路径

export PATH="$PATH:[NEW_DIRECTORY]/bin"
  • 更新~/.zshrc

    保存 ~/.zshrc

    source ~/.zshrc

  • 检查PATH

    echo $PATH


  • 4
    这是“Bash”的方式。 - CousinCocaine
    有效的方法 - Milan Tarami

    26

    选项1: 在~/.zshrc文件中添加这一行:

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

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

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


    你能详细说明这个答案与5年前发布的相同答案有什么不同吗? - Franklin Yu
    1
    在这个答案中并没有说你必须将这行代码添加到文件中,如果你只是这样运行它,它只会在当前的窗口中更改,这在原始答案中没有解释。 - Dimitar
    请将以下代码添加到.zshrc文件中(不需要引号):export PATH=$HOME/pear/bin:$PATH - Nelson Katale

    9

    如果你使用的是macOS(我使用的是Monterey 12.3.1),你可能像我一样在象征性地拔头发。上面的所有指令在终端会话中都有效,但无论我如何导出,它都无法持久化。此外,我找不到任何.zshrc文件。

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


    谢谢你。我以前从来不知道为什么会有 etc/paths 这个文件存在。使用它比我过去用过的所有导出 PATH 的方法都要简单得多。 - jamesnotjim
    这是在 Monterey 上对我有效的唯一方法。谢谢。 - Murrah
    我已经抓耳挠腮了大约2个小时。我终于在这里找到了答案。谢谢!这适用于Mac OS Monterey 12.5.1。 - Mike Diente

    2

    我使用的是 Monterey 12.4,而且唯一能够更改路径的方法是使用辅助函数。在 nano 中编辑文本文件没有任何效果。

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

    2

    对于我而言,PATH=$PATH:/path/to/file/bin 然后 export PATH 生效了。可以通过 echo $PATH 检查。其他解决方案是临时添加路径。


    1

    为了验证您的新目录已正确添加,您可以使用

    print -l $path

    由于其类型已知为数组,因此感谢它


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接