$path 和 $PATH(小写与大写)与 zsh 有什么区别?

Bas*_*que 18 zsh array path variable

FreeBSD 12 中,使用zshshell,我在查看$path(小写)和$PATH(大写)时注意到了这种差异。

echo $path
Run Code Online (Sandbox Code Playgroud)

/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin /usr/home/freebsd/bin

echo $PATH
Run Code Online (Sandbox Code Playgroud)

/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/home/freebsd/bin

一个输出由 SPACE 字符分隔,另一个由 COLON 字符分隔。

? 为什么会有差异?

这是两个不同的独立变量吗?还是小写/大写会触发某种我不知道的技巧或含义?

这是一个zsh功能吗?还是 FreeBSD 的一个特性?

Sté*_*las 26

这是zshcsh/继承的一个特性tcsh

所述$path 阵列变量被捆绑$PATH 标量(字符串)变量。对一个的任何修改都会反映在另一个中。

zsh(与 相反(t)csh)中,您可以将其他变量$PATH与 联系起来typeset -T。对以冒号分隔的标量使用大写名称,对数组使用小写的相同名称,这是惯例,但不是强制性的。虽然冒号是默认分隔符,但也可以使用其他分隔符(例如,换行符将多行字符串绑定到数组,或逗号将 csv 行绑定到数组)

zsh, typeset -p PATHor 的最新版本中typeset -p path显示了两个变量之间的联系:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )
Run Code Online (Sandbox Code Playgroud)

这很有用,因为它可以更轻松地添加删除组件或循环遍历它们。

做一个typeset -U path让元素独特也有助于保持$PATH变量干净(可以实现类似的东西tcshset -f)。