Bourne Again shell 手册说道:cd dir
[...] 中的每个目录名称CDPATH
都会被搜索目录。 […] 如果目录以斜杠 (/
) 开头,然后CDPATH
不使用。
Z shell 手册说:cd arg
否则,如果精氨酸以斜杠开头,尝试更改为给定的目录精氨酸。如果精氨酸不以斜杠开头,行为取决于当前目录是否
.
出现在 shell 参数中包含的目录列表中cdpath
。 [...] 如果.
出现在cdpath
,则cdpath
严格按顺序搜索,以便.
仅在适当的点尝试。
POSIX Ordinary shell 手册说CDPATH
:
其工作方式与PATH
那些不以/
incd
命令开头的目录相同。
Debian Almquist shell 手册说道cd
:
如果设置了 [...] shell 变量CDPATH
并且目录名称不以斜杠开头,则将在列出的目录中CDPATH
搜索指定目录。
'93 Korn shell 手册说道:cd arg
如果精氨酸以 a 开头/
,则不使用搜索路径。否则,搜索路径中的每个目录精氨酸。
MirBSD Korn shell 手册说道CDPATH
:
它的工作方式与PATH
那些不以/
incd
命令开头的目录相同。
除了 '93 Korn shell 之外,实际上情况并非如此:
% 导出 CDPATH=/tmp: % mkdir wibble /tmp/wibble % ksh93 -c 'cd ./wibble' /tmp/维布尔 % 破折号 -c 'cd ./wibble ;密码' /home/JdeBP/wibble % bash -c 'cd ./wibble ;密码' /home/JdeBP/wibble % mksh -c 'cd ./wibble ;密码' /home/JdeBP/wibble % lksh -c 'cd ./wibble ;密码' /home/JdeBP/wibble % posh -c 'cd ./wibble ;密码' /home/JdeBP/wibble % zsh -c 'cd ./wibble ;密码' /home/JdeBP/wibble %
/tmp/./wibble
存在并且是一个目录,但只有 '93 Korn shell 正在搜索CDPATH
并找到它。其余的则不然。
为什么不?
答案1
因为手册是错误的。
'93 Korn shell 也是错误的。
1997年单一 Unix 规范说:
如果目录操作数不以斜杠 (/
) 字符开头,并且第一个组成部分不是点或点-点,cd
则将搜索目录相对于CDPATH
变量中指定的每个目录,按列出的顺序。
2016年单一 Unix 规范以不同且稍微多余的方式表达相同的内容:
3. 如果目录操作数以 <slash> 字符开头,设置curpath
为操作数并继续执行步骤 7。4. 如果第一个组件目录操作数为点或点-点,继续步骤 6。
[…]
6. 设置
curpath
为目录操作数。
没有一本手册提到关于.
和 的部分..
,但这就是除了 '93 Korn shell 之外的每个 shell 实际所做的事情,尽管它们的手册是这样说的:
% 导出 CDPATH=/tmp: % lksh -c 'cd 摆动' /tmp/维布尔 % 破折号 -c 'cd 摆动' /tmp/维布尔 % posh -c 'cd 摆动' /tmp/维布尔 % bash -c 'cd 摆动' /tmp/维布尔 % mksh -c 'cd 摆动' /tmp/维布尔 % zsh -c 'cd 摆动;密码' /tmp/维布尔 %