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


13

FreeBSD 12中,在使用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
另外:在任何符合POSIX的外壳程序中,带有任何小写字符的变量名都保证可以安全地供应用程序使用(更改后不要以静默方式修改外壳程序或系统行为)。这是zsh决定只遵循对他们有意义的标准的地方之一,这可能使脚本作者感到头痛,因为标准化保证不适用。
查尔斯·达菲,

@CharlesDuffy您是否有指向标准部分的链接,该部分说明了有关小写和大写变量的任何内容?谢谢。
mosvy

@mosvy,pubs.opengroup.org / onlinepubs/9699919799/ basedefs/… -请牢记外壳程序和环境变量共享一个名称空间(设置外壳程序变量会更新任何现有的类似名称的环境变量的值;设置环境变量将初始化shell变量)。特定行:包含小写字母的环境变量名称的名称空间保留给应用程序。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。
查尔斯·达菲,

@CharlesDuffy在这里不适用。设置path里面zsh将不会更新任何pathENVVAR: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
mosvy

@mosvy,您已经说服我,它没有违反标准的规定。另一方面,这种精神将使for path in "$dir"/*反射性代码可以安全地编写。
查尔斯·达菲,

Answers:


20

这是zshcsh/ 继承的功能tcsh

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

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

在或的最新版本中zshtypeset -p PATHtypeset -p path显示两个变量之间的链接:

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

这很有用,因为它使添加删除组件或在它们上循环变得更容易。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.