因为手册是错误的。

因为手册是错误的。

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/维布尔
%

相关内容