![为什么“popd”弹出错误的目录?](https://linux22.com/image/221720/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9Cpopd%E2%80%9D%E5%BC%B9%E5%87%BA%E9%94%99%E8%AF%AF%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
这是预期的行为吗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。