首页/系统/Linux 运维命令速查/pushd / popd 目录栈切换
文件与目录76 条

pushd / popd 目录栈切换

把目录压栈/弹栈,在多个工作目录间快速往返;比反复 cd 更清晰,适合源码与配置目录来回切换。

Linux 运维命令速查系统更新于 2026-10-13

目录栈是什么

pushd、popd、dirs 是 bash、zsh、csh 提供的 shell 内建命令,共同维护一个属于当前会话的目录栈。pushd 在切进某个目录的同时把该路径压入栈,popd 从栈顶弹出并切回下一个目录,dirs 负责打印栈里的全部内容。相比反复 cd,或者只能记住一个位置的 cd -,它能把一整串工作目录排好队,在代码目录、配置目录、日志目录之间来回跳时不必背路径。

基本信息

适用平台Linux / macOS 的 bash、zsh、csh(Windows cmd 与 PowerShell 无此命令)
语法pushd 目录 | popd [+N | -N] | dirs [-v | -c | -l]
栈顶约定dirs 输出中最左边一项即栈顶,也就是当前目录
权限要求普通用户即可,实际能否进入仍受目标目录权限约束

典型使用场景

  • 改配置再回日志目录看效果:pushd /etc/nginx、pushd /var/log 之后 popd 就能一路退回
  • 对照排查两个目录中的同名文件,代替一遍遍敲长路径的 cd
  • 在交互式终端里跟着部署脚本走,用 dirs 随时确认自己在哪一层
  • 临时借用某个目录执行几条命令后立刻弹回原位置,保持后续相对路径不出错
  • 把常用目录提前 pushd 好,当作会话级的书签列表使用

常用示例

常用示例
pushd /etc/nginx        # 进目录并压栈,栈顶为 /etc/nginx
pushd /var/log          # 再压一层,栈变成 /var/log /etc/nginx ~
pushd /data/app         # 继续压栈,最左项是当前目录
dirs -v                 # 带编号列出整个栈,编号从 0 开始
dirs -c                 # 清空栈,只保留当前目录
pushd +2                # 把栈中第 2 项转到栈顶(旋转,不删除)
popd +1                 # 定点删掉第 1 项,不改变当前目录
popd                    # 弹出栈顶并切回 /var/log

输出逐列读法

列含义怎么用
左侧序号dirs -v 给出的栈内位置,从 0 开始计数配 pushd +N 旋转、popd +N 定点删除
第 0 项当前目录,也是栈顶每次 pushd 都会在最左边新增一项
后续各项历史压栈的目录,越靠右越早压入只有 popd 无参数时才依次弹回
~ 与相对路径压栈时原样记录,不自动展开栈里混有相对路径会让后续 popd 落到意外位置
pushd 不带参数时在栈顶两项之间互换,作用相当于 cd -;但 cd - 只记一个位置,目录栈能记一串。
脚本里可以写 pushd /some/dir >/dev/null 抑制路径回显,避免污染 stdout;需要安静模式时也可以重定向 2>&1。

易错点

  • 目录栈是 shell 会话级的:子 shell、( ... ) 分组、sudo bash 里都是空栈,交互式习惯直接搬进脚本会失效
  • 栈为空时 popd 报错并返回非 0,在 set -e 的脚本里会连带中止后面的逻辑
  • pushd 与 popd 的成败必须看返回值:失败时栈不变化,若误以为已切换目录,后续相对路径会落在错误位置
  • dirs -v 的编号每次操作后都会重排,把 +N 写死的脚本很容易错位

数据来源与参考

  • man 1 bash(pushd/popd 内建)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌