快速参考
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/user2. 指定位置弹出
# 重新构建栈$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# 移除了 /tmp3. 只操作栈不切换(-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/main5. 实用脚本技巧
# 保存和恢复目录栈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-v6. 与 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 高效十倍。熟练使用它们,是高效命令行工作者的标志之一。