Shell Daily 2026-01-05: 目录堆栈 (Directory Stack)
绝大多数开发者都知道 cd - 这个快捷键,它能让你在当前目录和“上一次所在的目录”之间反复横跳。但它的记忆力只有“7秒”——只能记住前一步。
如果你需要在三个甚至更多的目录之间(例如:源码目录、配置文件目录、日志目录)来回切换,cd - 就无能为力了。这时,你需要使用 Shell 内置的目录堆栈 (Directory Stack) 功能。
怎么用
这一组命令把目录导航变成了一种“堆叠”游戏:
-
pushd <目录>:将当前目录“压入”堆栈,并跳转到指定目录。 -
popd:将栈顶的目录“弹出”,并跳转回去。 -
dirs -v:查看当前堆栈里的所有目录。 -
兼容性:Bash / Zsh 特有。这是交互式 Shell 的高级功能,POSIX sh 不支持。
适用场景
- “回旋镖”式操作:需要临时进入某个深层目录执行命令,然后百分之百回到原来的位置(无论原来的路径有多复杂)。
- 多点巡检:在配置、日志和代码三个位置轮询修改和查看。
示例 1:临时跳转 (Boomerang)
假设你在 /etc/nginx/conf.d/ 调试配置,突然需要去 /var/log/nginx/ 看一眼最新的报错,看完马上回来:
# 当前在 /etc/nginx/conf.d/
$ pushd /var/log/nginx/
# 此时 Shell 会打印堆栈:/var/log/nginx /etc/nginx/conf.d# ... 在日志目录执行 tail -f error.log ...# 完事后,直接弹栈,瞬间回到 /etc/...
$ popd
示例 2:脚本中的环境切换
虽然建议在脚本中使用绝对路径,但在某些编译场景下,利用堆栈可以保持逻辑清晰:
# 压入构建目录
pushd ./build_dir > /dev/nullcmake .. && make
# 编译完直接弹出,回到项目根目录,继续后续操作
popd > /dev/nullecho "Build finished, back to $(pwd)"
(注:习惯了 pushd 后,你会发现自己越来越少用 cd。它就像给你的 Shell 导航装了一个“存档点”功能,想去哪就去哪,反正随时能读档回来。)