当我开始从 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
为什么除了空格和冒号以及当你修改它们时,它们会互相镜像?我对 zsh 环境变量的理解是什么?
答案1
$PATH
ist 是一个标量变量,而是$path
一个数组。
请注意,在第一种情况下,目录由$PATH
字符串本身内的冒号分隔;在第二种情况下,数组会自动扩展并由空格分隔:
$ print $PATH
/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
$print $path
/bin /usr/bin /usr/local/bin /usr/X11R6/bin
两种版本均自动保持同步嘚。那么,使用数组有什么好处呢?
- 后者您可以通过声明
typeset -U path
“仅保留每个重复值的第一次出现”(来自man zshbuiltins
)。这意味着即使您连续获取您的~/.zshrc
(因为您更改了它或其他原因),也可以保持您的路径干净,并且不会一次又一次地用相同的值弄乱它。 - 您可以使用
path+=(/new/path)
将新目录添加到 PATH。要删除元素,您必须使用一些技巧,例如https://stackoverflow.com/q/3435355/2037712或者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
资料来源:我自己的回答另一个问题。