为什么“popd”弹出错误的目录?

为什么“popd”弹出错误的目录?

这是预期的行为吗popd

>>> dirs -v
0 dirA
1 dirB
>>> dirs +0
dirA
>>> popd -n +0
dirA
>>> dirs -v
0 dirA

我希望最后一行告诉我堆栈中只剩下 dirB 了。我不明白为什么它删除了 dirB。

这是 GNU bash,版本 5.2.15(1)-release (aarch64-apple-darwin22.1.0)。我的 Pushd 和 Popd 已被 RVM 转换为函数,但即使我取消设置它们并使用内置函数,行为也是相同的。所以我认为我误解了 popd 的语义。

这里 dirA 是工作目录。手册确实说“当前目录始终是堆栈中的第一个目录”,但它也说您可以从堆栈中弹出内容,所以也许这是一个奇怪的灰色区域,您尝试从堆栈中弹出顶部元素同时压制cd行动。

从手册:

从目录堆栈中删除元素。元素从 dirs 列出的第一个目录开始从 0 开始编号;即popd相当于popd+0。

当未给出参数时,popd 将从堆栈中删除顶级目录并更改为新的顶级目录。

参数(如果提供)具有以下含义:

-n 从堆栈中删除目录时禁止目录的正常更改,以便仅操作堆栈。

+N 从堆栈中删除从零开始的第 N 个目录(从 dirs 打印的列表左侧开始计数)。

-N 从堆栈中删除从零开始的第 N 个目录(从 dirs 打印的列表右侧算起)。

如果修改了目录堆栈的顶部元素,并且未提供 -n 选项,则 popd 使用 cd 内置命令更改到堆栈顶部的目录。如果 cd 失败,popd 将返回一个非零值。

否则,如果遇到无效选项、目录堆栈为空或指定了不存在的目录堆栈条目,popd 将返回不成功状态。

如果 popd 命令成功,Bash 将运行 dirs 以显示目录堆栈的最终内容,返回状态为 0。

相关内容