在自由BSD12、使用zsh
shell,我在查看$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
这$path
大批变量是捆绑到$PATH
标量(字符串)变量。对其中一个的任何修改都会反映在另一个中。
在zsh
(与(t)csh
)相反,您可以将其他变量$PATH
与typeset -T
。按照惯例,但不是强制的,对冒号分隔的标量使用大写名称,对数组使用相同的小写名称。虽然冒号是默认分隔符,但也可以使用其他分隔符(例如换行符将多行字符串绑定到数组,或逗号将 csv 行绑定到数组)
在最新版本的zsh
, typeset -p PATH
ortypeset -p path
显示两个变量之间的链接:
% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )
这很有用,因为它可以更轻松地添加、删除组件或循环它们。
做一个typeset -U path
来制作元素独特的还有助于保持$PATH
变量干净(类似的事情可以在tcsh
with中实现set -f
)。
为了完整起见,fish
和yash
是另外两个可以视为$PATH
数组的 shell,尽管在它们的情况下,这不是通过单独的小写变量。
在fish
,名称以冒号结尾的变量PATH
被视为隐式拆分/连接的列表,所以set PATH /foo /bar
和set PATH /foo:/bar
在那里是等价的。
在 中yash
,将数组导出到环境会产生包含用冒号连接的元素的环境变量的值。所以你可以PATH=(/foo /bar)
在那里做。请注意,$PATH
在启动时从环境导入时,yash
不会自动将其创建为数组。