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

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

自由BSD12、使用zshshell,我在查看$path(小写)与$PATH(大写)时注意到了这种差异。

echo $path

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

echo $PATH

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

一个输出由空格字符分隔,另一个输出由冒号字符分隔。

➥ 为什么会有这样的差异?

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

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

答案1

这是一个特点zsh继承自csh/tcsh

$path 大批变量是捆绑$PATH 标量(字符串)变量。对其中一个的任何修改都会反映在另一个中。

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

在最新版本的zsh, typeset -p PATHortypeset -p path显示两个变量之间的链接:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

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

做一个typeset -U path来制作元素独特的还有助于保持$PATH变量干净(类似的事情可以在tcshwith中实现set -f)。

为了完整起见,fishyash是另外两个可以视为$PATH数组的 shell,尽管在它们的情况下,这不是通过单独的小写变量。

fish名称以冒号结尾的变量PATH被视为隐式拆分/连接的列表,所以set PATH /foo /barset PATH /foo:/bar在那里是等价的。

在 中yash,将数组导出到环境会产生包含用冒号连接的元素的环境变量的值。所以你可以PATH=(/foo /bar)在那里做。请注意,$PATH在启动时从环境导入时,yash不会自动将其创建为数组。

相关内容