也许我漏掉了,但我没有找到cd ''
应该成功的文档。由于没有名为 的目录''
,所以显然应该失败。例如,
mydir=
cd -- "$mydir" || exit 1 # succeeds!!
echo wrong
好像有一百万个脚本里都有 bug,随时可能出现。这算不算是某种向后兼容的 bug?难道我每次都要单独检查变量名是否为空吗cd
?顺便说一句,shellcheck
我也没发现这个问题。
也许我漏掉了,但我没有找到cd ''
应该成功的文档。由于没有名为 的目录''
,所以显然应该失败。例如,
mydir=
cd -- "$mydir" || exit 1 # succeeds!!
echo wrong
好像有一百万个脚本里都有 bug,随时可能出现。这算不算是某种向后兼容的 bug?难道我每次都要单独检查变量名是否为空吗cd
?顺便说一句,shellcheck
我也没发现这个问题。
cd
该实用程序的最新 POSIX 规范(第 8 期,自 2024 年起)在 OPERANDS 部分中有以下内容:然而,在撰写本文时(2025 年),这是一个相当新的补充,并且该标准的前一期指出,空操作数会导致实用程序执行的操作是“未指定的”,而由该标准的实施者来提供有用的一致行为。
我每天使用的所有 shell(
bash
、、zsh
OpenBSDksh
、ash
)都将cd ''
视为cd .
(或如果设置则为 中的第一个可访问目录$CDPATH
),而(非常非 POSIX)rc
(和衍生产品)和fish
shell 会为 生成错误cd ''
。cd
和会报告错误,除非在设置中csh
,在这种情况下,就像上面提到的那些 shell 一样,它会转到该数组中第一个可到达的目录。tcsh
$cdpath
$CDPATH
chdir()
如果这些 shell 希望符合 POSIX 标准(有些符合,有些不符合,但倾向于将内置标准实用程序的一般行为与通用标准保持一致),我相信它们会随着时间的推移而更新以符合新规范。
事实上,最新的开发版本是
bash
这样做的:与此同时,如果这对你自己的脚本很重要,你应该测试用作 操作数的shell变量的值
cd
。最简单的做法是cd "${mydir:?Empty or unset variable}"
在脚本中使用类似如下代码:...或者在使用变量之前对其进行单独的健全性检查。