在FreeBSD 12中,在使用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
另外:在任何符合POSIX的外壳程序中,带有任何小写字符的变量名都保证可以安全地供应用程序使用(更改后不要以静默方式修改外壳程序或系统行为)。这是zsh决定只遵循对他们有意义的标准的地方之一,这可能使脚本作者感到头痛,因为标准化保证不适用。
—
查尔斯·达菲,
@CharlesDuffy您是否有指向标准部分的链接,该部分说明了有关小写和大写变量的任何内容?谢谢。
—
mosvy
@mosvy,pubs.opengroup.org / onlinepubs/9699919799/ basedefs/… -请牢记外壳程序和环境变量共享一个名称空间(设置外壳程序变量会更新任何现有的类似名称的环境变量的值;设置环境变量将初始化shell变量)。特定行:包含小写字母的环境变量名称的名称空间保留给应用程序。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。
—
查尔斯·达菲,
@CharlesDuffy在这里不适用。设置
—
mosvy
path
里面zsh
将不会更新任何path
ENVVAR: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
。
@mosvy,您已经说服我,它没有违反标准的规定。另一方面,这种精神将使
—
查尔斯·达菲,
for path in "$dir"/*
反射性代码可以安全地编写。