哪里在zsh中放置$ PATH变量断言?


110

我喜欢zsh,但是我不确定将我的$PATH和其他变量断言放在哪里?我发现它们分散在文件之间.zshrc .zprofile .bashrc .bash_profile,有时会加倍。

我认识到,具有内部的任何bash文件,没有多大意义看到,因为我使用的zsh,但正是我应该把我rvmpythonnode等添加到我的$PATH

有没有我应该使用(即一个特定的文件.zshenv,其不会没有目前在我的安装存在),我目前使用的手机之一,或者它甚至重要吗?

Answers:


148

tl; dr版本:使用 ~/.zshrc

阅读手册页以了解它们之间的区别:

~/.zshrc~/.zshenv~/.zprofile


关于我的评论

在我对凯夫给出的答案的评论中,我说:

这似乎是不正确的-我可以找到的任何zsh文档中都未列出/ etc / profile。

事实证明这是部分不正确的:/etc/profile 可能来自zsh但是,只有在zsh“作为sh或调用ksh” 时,才会发生这种情况。在以下兼容模式下:

通常的zsh启动/关闭脚本不会执行。登录shell源/ etc / profile,后跟$ HOME / .profile。如果在调用时设置了ENV环境变量,则$ ENV将在配置文件脚本之后提供。在将ENV的值解释为路径名之前,先对其进行参数扩展,命令替换和算术扩展。[ man zshall,“兼容性” ]。

ArchWiki ZSH链接说:

登录时,Zsh以此顺序获取以下文件:
/ etc / profile
此文件由登录时所有Bourne兼容的shell来获取。

这implys那/etc/profile永远读通过zsh在登录时-我没有与Arch Linux的项目的经验; Wiki对于该发行版可能是正确的,但通常并不正确。该信息比较zsh的手册页不正确的,似乎并不适用于OS X上的zsh(在路径$PATH中集/etc/profile不使其向我的zsh会话)。



要解决这个问题:

我应该在哪里将rvm,python,node等添加到$ PATH的确切位置?

一般来说,我会导出我$PATH~/.zshrc,但它是值得拥有的读zshall手册页,特别是“启动/关闭文件”部分- ~/.zshrc阅读的互动炮弹,这可能会或可能不适合您的需求-如果你想$PATH为每个zsh外壳由你调用(包括interactive不,无论是login和不是,等),然后~/.zshenv是一个更好的选择。

我是否应该使用一个特定的文件(即,我的安装中当前不存在的.zshenv),我当前正在使用的文件之一,或者甚至有关系?

启动时会读取大量文件(请检查链接的man页面),这是有原因的-每个文件都有特定的位置(每个用户的设置,特定于用户的设置,登录外壳程序的设置,每个外壳程序的设置,等等)。
不必担心~/.zshenv不存在-如果需要,请制造它,它会被读取。

.bashrc.bash_profile被读取zsh,除非你明确地从源头他们~/.zshrc或相似; 之间的语法bashzsh不是总是兼容。这两个.bashrc.bash_profile设计用于bash设置,而不是zsh设置。


3
感谢您对西蒙(Simont)的详尽回答。您说的很奇怪,.bashrc并且.bash_profile不被阅读,zsh因为我目前在中rvm添加了我的内容,$PATH在中添加了.bashrc我的python内容.bash_profile,并且两个都很好地添加了。无论如何,我将所有$PATH出口都移到~/.zshrc其他所有zsh配置都存放在这里。我必须承认,我对不同类型的外壳不太熟悉。通过阅读您发布的链接,我猜我使用的是交互式外壳,但是我将进一步阅读以确保...再次感谢!
stefmikhail,2012年

30

这是zsh手册页中“启动/关闭文件”部分下的文档。

   Commands  are  first  read from /etc/zshenv this cannot be overridden.
   Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
   former  affects all startup files, while the second only affects global
   startup files (those shown here with an path starting with  a  /).   If
   one  of  the  options  is  unset  at  any point, any subsequent startup
   file(s) of the corresponding type will not be read.  It is also  possi-
   ble  for  a  file  in  $ZDOTDIR  to  re-enable GLOBAL_RCS. Both RCS and
   GLOBAL_RCS are set by default.

   Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login
   shell,  commands  are  read from /etc/zprofile and then $ZDOTDIR/.zpro-
   file.  Then, if the  shell  is  interactive,  commands  are  read  from
   /etc/zshrc  and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login
   shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

从中我们可以看到读取的订单文件是:

/etc/zshenv    # Read for every shell
~/.zshenv      # Read for every shell except ones started with -f
/etc/zprofile  # Global config for login shells, read before zshrc
~/.zprofile    # User config for login shells
/etc/zshrc     # Global config for interactive shells
~/.zshrc       # User config for interactive shells
/etc/zlogin    # Global config for login shells, read after zshrc
~/.zlogin      # User config for login shells
~/.zlogout     # User config for login shells, read upon logout
/etc/zlogout   # Global config for login shells, read after user logout file

您可以在此处获得更多信息。


18

我有类似的问题(在bash终端命令运行正常,但zsh显示命令未找到错误)

解:


只需将您先前粘贴到〜/ .bashrc中的内容粘贴到:

~/.zshrc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.