一、学习前言本次小学期第六节课围绕 Shell 底层原理展开在此之前我只会零散使用 cd、ls、echo 这类简单终端指令并不清楚 Shell 到底是什么、终端进程之间存在怎样的父子关系也分不清内建命令和外部命令的底层区别。本节课全部知识点都在 Xshell 连接 Linux 虚拟机完成实操过程中记录了操作现象、报错原因、命令运行逻辑整理成本篇完整学习博客覆盖 PPT 全部核心知识点搭建完整知识框架附带全部可复现操作命令、实操现象分析、课后练习题完整流程满足本次课程作业发布至 CSDN 的全部要求。二、Shell 基础概念与各类 Shell 详解2.1 到底什么是 ShellShell 是一门使用 C 语言编写的程序是普通用户和 Linux 操作系统内核之间的中间桥梁。操作系统内核负责管理硬件资源但普通用户无法直接和内核交互所有操作指令都需要通过 Shell 进行翻译转发。Shell 拥有双重身份交互式命令解释语言也就是我们日常打开 Xshell 终端在$提示符后输入单行命令Shell 实时解析、交给内核执行立刻返回运行结果我们平时操作虚拟机都使用这种模式。脚本编程语言可以把多条连续执行的命令统一写入后缀为.sh的文本文件形成 Shell 脚本一次性批量执行大量操作适合自动化运维、批量处理文件等场景。简单举例我们输入ls查看目录文件不是系统直接执行是 Shell 先读取ls指令判断命令类型再调用对应程序最后把文件列表输出到终端界面。2.2 Linux 系统常见 Shell 类型Linux 发行版内置多种不同版本的 Shell 解释器语法、功能各有差异课堂重点讲解主流几种Bourne Shell/bin/sh最早诞生的标准 Shell兼容性极强系统底层脚本大多会使用 sh 解释执行Bourne Again Shell/bin/bash当前绝大多数 Ubuntu、CentOS 系统默认登录 Shell在 sh 基础上扩展大量实用功能支持别名、命令历史、子进程、后台任务等本节课所有操作均基于 bashC Shellcsh语法风格和 C 语言相似多用于早期 Unix 系统国内服务器极少使用K Shellksh融合 bash 与 csh 特性企业大型服务器偶尔使用/sbin/sh专门给 root 超级管理员用户使用的专用 Shell。2.3 查看与切换 Shell 实操步骤Xshell 终端执行查看当前登录终端正在使用的 Shellecho $SHELL执行后会输出/bin/bash代表当前默认解释器为 bash。2. 查看系统全部预装支持的 Shell 程序cat /etc/shells文件内会列出系统所有合法 Shell 路径包含 bash、dash、sh 等。3. 查看 /bin 目录下所有以 sh 命名的程序文件区分软链接与真实程序bash运行ls -lF /bin/*sh输出结果中带*代表可执行程序-代表软链接比如sh-dash说明系统里 sh 实际指向 dash 程序。4. 查看用户登录默认 Shell 配置文件系统所有用户信息存放在/etc/passwd每行代表一个用户第七个字段就是该用户登录默认 Shell 程序bash运行cat /etc/passwd | grep 你的虚拟机用户名临时切换其他 Shell以 dash 为例输入/bin/dash即可创建子 shell 切换解释器切换完成后所有命令由 dash 解析想要回到原本 bash输入内置命令exit退出当前子 shell。2.4 Shell 脚本首行声明 #!/bin/bash 详解当我们编写.sh后缀脚本文件时文件第一行必须固定填写#!/bin/bash这行语句不会被当作命令执行是系统识别标记#!是特殊标识符后续路径/bin/bash代表指定使用 bash 解释器运行当前脚本同理如果是 Python 脚本可以写#!/usr/bin/python3。如果省略这一行系统会使用当前终端默认 Shell 执行脚本容易出现语法兼容报错规范编写脚本必须添加该行声明。三、Shell 父进程与子进程完整解析3.1 父 Shell、子 Shell 基础定义父 Shell打开 Xshell 终端、登录虚拟机后自动生成的交互式 bash 进程带有$交互提示符是所有后续衍生 Shell 的父进程拥有独立 PID进程 ID子 Shell在父 Shell 中执行特定指令时系统 fork 创建全新独立 bash 进程子 Shell 拥有自己的 PIDPPID 字段记录父进程编号子 Shell 的环境变量、工作目录默认不会反向影响父 Shell。3.2 会生成子 Shell 的常见场景终端直接输入bash、dash等 Shell 解释器命令使用圆括号()包裹一组命令执行命令末尾添加放入后台运行使用coproc协程命令创建后台任务。3.3 实操验证父子 Shell 嵌套关系初始状态查看进程树直观查看进程 PID、父子层级ps --forest输出会以树形排版展示进程最顶层 bash 即为父 Shell。2. 连续创建多层嵌套子 Shellbashbashbash连续三次输入 bash相当于在子 shell 内部再次创建子 shell形成三层嵌套结构。3. 再次执行进程树查看命令ps --forest此时可以清晰看到树形分层每一层 bash 都依附上一层父进程PPID 与上层 PID 对应。4. 逐层退出子 Shell每次输入exit只能关闭当前最内层子 shell多次执行直到回到最初打开终端的父 Shell。3.4 区分是否存在子 Shell环境变量BASHSUBSHELL系统内置变量BASH_SUBSHELL 系统内置变量BASHS​UBSHELL系统内置变量BASH_SUBSHELL专门用于判断当前是否处于子 shell 环境输出数值为 0当前运行在父 Shell没有创建子进程输出数字大于等于 1当前处于子 Shell 环境数字代表嵌套层级。实操对比演示分号分隔单行多命令不会创建子 shellpwd; ls; echo $BASH_SUBSHELL终端输出结果为 0。2. 圆括号包裹命令强制生成子 shell(pwd; ls; echo $BASH_SUBSHELL)终端输出结果为 1证明新子 shell 已创建如果括号内部再嵌套一组括号数值会变为 2。这里补充实操坑点在子 shell 内部使用 cd 切换工作目录只会改变子 shell 自身路径退出子 shell 后父 Shell 工作目录保持不变不会同步修改。四、Shell 四种运行模式实操详解4.1 分号分隔命令无新进程父 Shell 直接执行多条无关命令写在同一行使用英文分号;隔开命令从上至下顺序执行全程不创建子 shell所有操作都在当前父进程完成适合一次性执行多条简单指令。mkdir testdir; cd testdir; touch test.txt; ls4.2 括号进程列表新建独立子 Shell 执行将一组命令整体放入英文圆括号(命令1;命令2)系统会自动创建子 shell 运行括号内所有代码隔离环境变量、工作目录适合需要临时切换环境、不影响主终端的操作。示例( mkdir temp; cd temp; echo “子shell测试文件” demo.txt; ls )执行结束后父 Shell 当前目录不会切换到 temp 文件夹。4.3 后台运行模式 后台任务管理在任意命令末尾添加符号该命令会放入后台异步运行终端不会被占用我们可以继续输入其他指令。完整实操流程后台执行休眠 60 秒任务sleep 60 终端会输出后台任务编号与进程 PID。2. 查看当前所有后台运行任务jobs查看任务详细PID信息jobs -l使用 ps 查看系统全部进程验证后台 sleep 进程存在bash运行ps -f等待 60 秒任务执行完毕按下回车键终端会自动打印任务完成提示。4.4 coproc 协程自定义后台子 shell 任务coproc 是 bash 高级内置功能专门在后台生成独立子 shell 执行任务默认进程名称为 COPROC支持自定义任务名称适合需要长期后台运行、独立交互的程序。默认协程写法bash运行coproc sleep 10jobs -l自定义协程名称语法严格规范大括号{前后必须保留空格命令末尾必须添加分号闭合}前同样需要空格否则直接语法报错bash运行coproc My_Sleep_Task { sleep 10; }jobs -l执行 jobs 可以看到自定义名称的后台协程子 shell。五、内建命令与外部命令核心区分5.1 外部命令文件系统命令外部命令是独立的二进制可执行文件存放在系统/bin、/usr/bin、/sbin等目录中不属于 bash 程序本身。运行外部命令时操作系统会执行 fork 操作创建全新子进程运行程序开辟独立内存空间进程创建、销毁存在资源开销运行速度相对较慢。常见外部命令ps、ls、grep、cat。5.2 内建命令Shell 内置工具内建命令直接编译集成在 bash 程序内部不存在独立的外部文件执行时不需要创建子进程直接在当前 Shell 进程内运行占用资源少、执行速度更快。常见纯内建命令cd、exit、history、alias。特殊情况部分命令同时拥有内置版本与外部文件版本例如 echo、pwd使用 type 命令可以同时查看两种实现。5.3 实操区分内外建命令查看外部命令 ps定位程序文件路径bash运行which ps查看命令所有实现内置外部type -a ps输出可以看到 ps 存在独立 /usr/bin 程序文件无内置实现。2. 查看纯内置命令 cd、exitbash运行type -a cdtype -a exit终端提示cd is a shell builtin说明仅存在内置实现无外部文件。3. 查看双实现命令 echo、pwdbash运行type -a echotype -a pwd输出同时显示 shell builtin 和 /bin/echo代表两种实现都存在终端默认优先使用内置版本。六、两大重点内建命令完整实操含课后练习题6.1 history 历史命令内建命令history 作用自动记录当前终端所有输入过的指令方便快速重复调用历史命令。核心存储规则命令操作先临时保存在内存中只有关闭终端、退出 Shell 会话时内存中的记录才会写入家目录隐藏文件.bash_history会话未结束时新输入命令不会自动同步到文件。基础操作命令全集