你在这里比较苹果和梨。
您引用的 xopen 规范是指 C-function chdir
。
我正在使用的两个 shell(bash 和 zsh)有一个内部命令 cd,在两个 shell 中,一个
cd ''
被解释为无操作。这在手册页中有解释,例如对于 bash:
CDPATH 中的空目录名称与当前目录相同,即“.”。
所以这是预期的行为。请注意,您引用的标准没有说明 shell 的 cd 命令。
我没有检查 bash 和 zsh 的开发人员实际上是如何实现 cd 命令的,但是如果他们想遵守自己的规范,就必须(用 C 语言)实现它,类似于:
if(argc == 0) {
chdir(getenv("HOME"));
} else if(strlen(argv[1]) == 0) {
chdir(".");
} else {
chdir(argv[1]);
}
如果不以这种方式完成,则 chdir 命令的行为将取决于系统库的底层实现(是的,取决于对 xopen 标准的一致性),这肯定是 shell 实现中的一个错误(尽管与您所指的不同)。
更新:正如CoolRaoul在他的评论中正确指出的那样,我对 bash 手册页的引用与此处无关,因为它仅指 CDPATH 中的空元素,而不是cd
命令的空参数。虽然可以合理地假设两种情况下的效果应该相同,但这并没有明确规定。zsh 联机帮助页也是如此。在这两个手册页中,也没有明确说明 cd 命令调用 C 函数chdir
(尽管这也可以合理地假设),它们似乎也没有提到任何对 xopen 规范的遵守。至少对于 bash 和 zsh,我认为我们可以有把握地说 的行为cd ""
只是未指定的。
顺便说一句,我还尝试使用 Cygwin 附带的 ksh(并将其标识为 MIRBSD KSH R50),它的行为方式与 bash 和 zsh 相同。