zsh config - 导出还是不导出?

jor*_*ver 36 zsh shell

在我中设置变量时,我~/.zshrc可以使用export

export PATH=/some/path
Run Code Online (Sandbox Code Playgroud)

或不

PATH=/some/path
Run Code Online (Sandbox Code Playgroud)

这些有什么不同,我应该使用哪个?

dem*_*ure 28

如果您希望从 zsh 运行的程序查看 var,请将其导出。
对于路径,您可能想要导出。
而不是export PATH=/some/path您可能想要的export PATH="$PATH:/some/path",除非您打算完全清除系统预设路径。

  • 但是这两者有什么不同呢?特别是在它与`PATH`无关的情况下。如果我做`JAVA_HOME=...` 与`export JAVA_HOME=..` 会怎样 (2认同)
  • “[你_**可能**_想要`导出`](https://superuser.com/a/598823)”(强调我的)实际上并不是它们有何不同的问题,它只是_可能_回答是否OP 应包含“导出”。此外,答案确实给出了关于不删除“PATH”的好建议,但该建议与问题无关。 (2认同)

mpy*_*mpy 27

Demure 已经回答了您的具体问题。然而,这是一个zsh问题和关于PATH。所以这里还有一点:除了标准变量$PATH,还有$path,它是一个数组。在这里您可以看到区别(冒号与否...):

$ print $PATH
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
$ print $path
/bin /usr/bin /usr/local/bin /usr/X11R6/bin
Run Code Online (Sandbox Code Playgroud)

两种变体都会自动保持同步。那么,使用数组有什么好处呢?

  • 后者您可以声明 viatypeset -U path以“仅保留每个重复值的第一次出现”(来自man zshbuiltins)。这意味着这可以保持你的路径干净,即使你连续获取你的~/.zshrc(因为你改变了它或其他什么)并且不要一次又一次地用相同的值把它弄乱。
  • 您可以使用path+=(/new/path)将新目录添加到 PATH。要删除元素,您必须使用一些技巧,例如参见/sf/ask/240474881/http://www.zsh.org/mla/users//2005/msg01132.html
  • 您可以通过以下方式轻松遍历 PATH 中的元素 for i ($path) { print $i # or do something else }

最后,这是我的配置的摘录:

typeset -U path
path=(/new/path1
      /new/path2
      $path)
export PATH
Run Code Online (Sandbox Code Playgroud)

  • @Lucas:“两种变体都会自动保持同步。” (2认同)