在zsh中放置$ PATH变量断言的位置?

时间:2012-05-13 19:48:22

标签: macos shell zsh

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

我意识到在bash文件中包含任何内容并没有多大意义,因为我正在使用zsh,但我应该在哪里放置rvmpythonnode等添加到我的$PATH

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

3 个答案:

答案 0 :(得分:118)

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

read the man page了解之间的差异:

  

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


关于我的评论

在我对答案kev gave的评论中,我说:

  

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

结果证明部分不正确:/etc/profile 可能来自zsh,只有在zsh被“shksh”调用时才会出现这种情况。在这些兼容模式中:

  

不执行通常的zsh启动/关闭脚本。登录shell源/ etc / profile后跟$ HOME / .profile。如果在调用时设置ENV环境变量,则在概要文件脚本之后获取$ ENV。 ENV的值在被解释为路径名之前经过参数扩展,命令替换和算术扩展。 [man zshall, "Compatibility"]。

ArchWiki ZSH link说:

  

登录时,Zsh按此顺序提供以下文件:
  / etc / profile文件
  此文件由登录时所有与Bourne兼容的shell提供

这意味着/etc/profile 总是在zsh在登录时读取 - 我对Arch Linux项目没有任何经验; wiki对于该分发可能是正确的,但通常是正确的。与zsh手册页相比, 信息不正确,并且似乎不适用于OS X上的zsh($PATH中设置的/etc/profile中的路径不适用于我的zsh会议)。



解决问题:

  

我应该把我的rvm,python,node等添加到我的$ PATH中吗?

通常情况下,我会从$PATH导出~/.zshrc,但值得阅读zshall手册页,特别是“STARTUP / SHUTDOWN FILES”部分 - {{1对于交互式 shell,可能会或可能不符合您的需求 - 如果您希望~/.zshrc为您调用的每个$PATH shell(zsh而不是,interactive和不是,等等,那么login是一个更好的选择。

  

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

在启动时读取了一堆文件(检查链接的~/.zshenv页面),这是有原因的 - 每个文件都有它的特定位置(每个用户的设置,用户特定的设置,设置)登录shell,每个shell的设置等) 不要担心man不存在 - 如果你需要它,制作它,它将被阅读。

~/.zshenv.bashrc .bash_profile读取,除非您明确地从zsh或类似地提取它们; ~/.zshrcbash之间的语法始终兼容。 zsh.bashrc都设计用于.bash_profile设置,而不是bash设置。

答案 1 :(得分:26)

这是来自STARTUP / SHUTDOWN FILES部分下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

您可以获得更多信息here

答案 2 :(得分:13)

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

解决方案:


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

~/.zshrc