Linux命令-popd(从目录栈弹出并切换目录)
快速参考popdpop 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/tmppushd/var/logpushd/etc /etc /var/log /tmp ~ $dirs-v0/etc1/var/log2/tmp3~# 弹出栈顶并切换到 /var/log$popd/var/log /tmp ~ $pwd/var/log# 重新构建$pushd/etcpushd/usr/binpushd/opt /opt /usr/bin /etc /var/log /tmp ~ $dirs-v0/opt1/usr/bin2/etc3/var/log4/tmp5~# 2从栈顶往下数第 2 个位置/etc并弹出它不影响栈顶$popd2 /opt /usr/bin /var/log /tmp ~# ^^^^^^^^ /etc 被移除了# 恢复重新 pushd /etc$pushd/etc# -N从栈底开始计数~ 是 -0/tmp 是 -1以此类推$popd-1# 移除了 /tmp3. 只操作栈不切换-n$pushd/varpushd/tmppushd/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_logspushd/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)$pushd1 /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];thenwhileIFSread-rdir;dopushd-n$dir/dev/null21done(tac/tmp/dirstack.txt)# 不切回第一个只重建栈fi}# 在脚本中安全使用 popdsafe_popd(){if[$(dirs-p|wc-l)-gt1];thenpopd$elseechoDirectory stack has only one entryfi}# 清空目录栈保留当前目录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~ $dirs2# 显示特定位置/tmp# pushd 不带参数$pushd/tmppushd/varpushd/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 高效十倍。熟练使用它们是高效命令行工作者的标志之一。