zsh的$path和$PATH有什么区别?

Rox*_*oxy 3 zsh

当我开始从 bash 迁移到 zsh 时,我发现了许多差异。其中之一如下:

envy% echo $path
/usr/local/bin /usr/bin /bin /usr/sbin /sbin /opt/X11/bin

envy% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
Run Code Online (Sandbox Code Playgroud)

为什么除了空格和冒号之外以及当您修改它们时,它们会相互镜像?我这里没有的关于 zsh 环境变量的理解是什么?

mpy*_*mpy 5

$PATHist 是一个标量变量,而 is$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)

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

  • 后者您可以声明 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)

资料来源:我自己对另一个问题的回答。