当前shell层级由$shlvl给出,但真实父子关系需用pstree -s $$或ps --forest验证;$shlvl是shell自维护计数器,而pstree和ps反映内核fork链路。

当前 Shell 的层级数由 $SHLVL 环境变量直接给出,不是靠 pstree 或 ps 推导出来的;但要真正理解父子关系,必须结合 ps --forest 和 pstree -s $$ 看实际进程链。
怎么看当前 Shell 是第几层?
Shell 层级是 bash/zsh 等 shell 自己维护的计数器,每次启动子 shell 就加 1。它不反映真实进程树深度,只表示“你手动嵌套了多少次”。
- 运行
echo $SHLVL即得当前层级值,比如输出3表示这是第 3 层 shell(初始登录 shell 是 1) - 这个值可被篡改或重置,
export SHLVL=1不会改变进程结构,只是骗了自己 - 新终端、SSH 登录、
bash命令都会让$SHLVL+1;exit退出后父 shell 的$SHLVL不变
怎么用 pstree 查看当前 Shell 的真实父子链?
pstree 显示的是内核里真实的 fork 关系,比 $SHLVL 更可靠,尤其当你怀疑有脚本或服务悄悄起了子 shell 时。
- 运行
pstree -s $$——$$是当前 shell 的 PID,-s会往上追溯所有父进程,直到systemd(1)或init - 如果看到
systemd───sshd───bash───bash───bash,说明你通过 SSH 登录后又手动执行了两次bash,物理上确实是三层 - 注意:
pstree sshd或pstree -u可帮你确认哪些bash属于哪个用户,避免混淆系统服务和交互式 shell
为什么 ps --forest 比 pstree 更适合看 shell 嵌套?
ps --forest 输出是纯文本缩进树,保留了每个进程的 TTY、PID、PPID 和 CMD,对调试 shell 启动逻辑更直观。
- 运行
ps -o pid,ppid,tty,comm --forest,能一眼看出哪个bash的PPID指向另一个bash,确认父子关系 - 对比
ps -p $$ -o ppid=和ps -p $PPID -o comm=,可验证当前 shell 的直接父进程是不是 shell -
ps不合并同名进程(不像pstree默认把多个bash缩成bash─┬─bash─┬─bash),更适合数清楚到底开了几个独立实例
真正容易被忽略的是:$SHLVL 是 shell 解释器自己记的“我被嵌套了几层”,而 pstree -s $$ 和 ps --forest 看到的是内核记录的“谁 fork 了谁”。两者在大多数手动操作场景下一致,但一旦涉及 systemd user session、容器 init、或 exec -a 替换进程,就可能错位。别只信 $SHLVL。











