目录栈是什么
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。