Linux命令-popd(从目录栈弹出并切换目录)
2026/6/17 2:29:30 网站建设 项目流程

快速参考

popd(pop directory)用于从目录栈中弹出(移除)顶部目录,并切换到新的栈顶目录。它是目录栈管理的三大命令之一,配合pushd(压入)和dirs(查看)形成完整的快速目录导航体系。

目录栈就像一个"浏览器历史记录"——pushd 是"前进到新页面",popd 是"后退到上一页",dirs 是"查看历史"。掌握了这三个命令,你就能在复杂的目录结构中飞速穿梭。

命令语法

popd [选项]

常用选项

选项功能
-n弹出但不切换目录(只操作栈)
+N弹出栈中第 N 个目录(从顶部数,从 0 开始)
-N弹出栈中倒数第 N 个目录(从底部数)

目录栈的概念

目录栈是一个 LIFO(后进先出)的数据结构,存储你最近访问过的目录序列:

栈顶 ─── dirs 显示的左端(最近 pushd 的目录,也是当前目录) dirs 显示的中间 栈底 ─── dirs 显示的右端(最早 pushd 的目录)
# 初始化$cd/tmp $pushd/usr/local /tmp /usr/local# dirs 显示: /usr/local /tmp# 栈顶 ^^^^^^^^ 栈底 ^^^^

实战示例

1. 基础使用

# 构建目录栈$cd/home/user $pushd/tmp /tmp ~ $pushd/var/log /var/log /tmp ~ $pushd/etc/nginx /etc/nginx /var/log /tmp ~# 查看当前栈$dirs/etc/nginx /var/log /tmp ~ $dirs-v# 带编号显示0/etc/nginx# 栈顶(当前目录)1/var/log2/tmp3~# 栈底# 弹出:回到上一个目录$popd/var/log /tmp ~# 切换到 /var/log$pwd/var/log# 再次弹出$popd/tmp ~# 切换到 /tmp$pwd/tmp# 最后一次弹出$popd~# 回到 ~$pwd/home/user

2. 指定位置弹出

# 重新构建栈$pushd/tmp&&pushd/var/log&&pushd/etc /etc /var/log /tmp ~ $dirs-v0/etc1/var/log2/tmp3~# 弹出栈顶并切换到 /var/log$popd/var/log /tmp ~ $pwd/var/log# 重新构建$pushd/etc&&pushd/usr/bin&&pushd/opt /opt /usr/bin /etc /var/log /tmp ~ $dirs-v0/opt1/usr/bin2/etc3/var/log4/tmp5~# +2:从栈顶往下数第 2 个位置(/etc)并弹出它(不影响栈顶)$popd+2 /opt /usr/bin /var/log /tmp ~# ^^^^^^^^ /etc 被移除了# 恢复(重新 pushd /etc)$pushd/etc# -N:从栈底开始计数(~ 是 -0,/tmp 是 -1,以此类推)$popd-1# 移除了 /tmp

3. 只操作栈不切换(-n)

$pushd/var&&pushd/tmp&&pushd/usr /usr /tmp /var ~ $dirs-v0/usr1/tmp2/var3~# -n 弹出但不切换目录$popd-n/tmp /var ~ $pwd/usr# 仍然在 /usr,没有切换!# 栈变了但目录没变——不常用,但了解即可$dirs-v0/usr# 栈顶是 /usr,当前也确实在 /usr1/tmp2/var3~# 注意:刚刚栈顶被弹出了(之前是 /usr /tmp /var ~),/usr 现在在栈顶

4. 完整工作流示例

# 场景:在多个项目目录间快速切换# 初始化工作环境$cd~/project/main $pushd~/project/module-a ~/project/module-a ~/project/main $pushd~/project/module-b ~/project/module-b ~/project/module-a ~/project/main $pushd/opt/configs /opt/configs ~/project/module-b ~/project/module-a ~/project/main# 查看当前在哪、有哪些目录可用$dirs-v0/opt/configs# 当前位置1~/project/module-b# popd 后要去的位置2~/project/module-a3~/project/main# 编辑配置$vimsettings.yaml# 回到 module-b$popd~/project/module-b $pwd/home/user/project/module-b# 回到 module-a$popd~/project/module-a# 回到 main$popd~/project/main# 便捷匹配:dirs 支持通配$pushd/tmp/nginx_logs&&pushd/tmp/app_logs $pushd~/project/ +1# 切换到栈中 ~/project/ 匹配项# 快速跳到特定目录$pushd/var/log/nginx $pushd/etc/nginx $dirs-v0/etc/nginx1/var/log/nginx2/tmp/app_logs3/tmp/nginx_logs4~/project/main# 跳到 /var/log/nginx (索引 1)$pushd+1 /var/log/nginx /etc/nginx /var/log/nginx /tmp/app_logs /tmp/nginx_logs ~/project/main

5. 实用脚本技巧

# 保存和恢复目录栈save_dirs(){dirs-p>/tmp/dirstack.txt}restore_dirs(){if[-f/tmp/dirstack.txt];thenwhileIFS=read-rdir;dopushd-n"$dir">/dev/null2>&1done<<(tac/tmp/dirstack.txt)# 不切回第一个,只重建栈fi}# 在脚本中安全使用 popdsafe_popd(){if[$(dirs-p|wc-l)-gt1];thenpopd"$@"elseecho"Directory stack has only one entry"fi}# 清空目录栈(保留当前目录)clear_dir_stack(){while[$(dirs-p|wc-l)-gt1];dopopd-n>/dev/nulldone}# 批量 pushdfordirin/var/log /tmp /etc /usr/local/bin;dopushd"$dir">/dev/nulldonedirs-v

6. 与 pushd/dirs 的配合

# dirs:显示目录栈$dirs# 空格分隔/etc /var/log /tmp ~ $dirs-p# 每行一个/etc /var/log /tmp ~ $dirs-v# 带编号0/etc1/var/log2/tmp3~ $dirs+2# 显示特定位置/tmp# pushd 不带参数$pushd/tmp&&pushd/var&&pushd/etc /etc /var /tmp ~ $pushd# 交换栈顶两个目录/var /etc /tmp ~# 当前目录变为 /var

发行版差异

popd是 Bash/Zsh/Fish 等 Shell 的内置命令,不存在发行版差异——所有 Linux 系统、macOS 终端中行为完全一致。

# 确认 popd 是内置命令$typepopdpopdis a shellbuiltin

总结

三大目录栈命令速记:

命令功能类比
pushd dir切换到 dir,压入旧目录浏览器打开新页面
popd弹出栈顶,切换到前一目录浏览器后退
dirs -v查看目录栈浏览器历史记录

核心记忆:

pushd/new/dir# 去新地方,记住来的路popd# 回到来的地方dirs-v# 查看我去过哪里

在你需要频繁在几个目录间跳转时,pushd/popd 比不停地敲 cd /long/path 高效十倍。熟练使用它们,是高效命令行工作者的标志之一。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询