Linux 学习笔记(二):终端、Shell 与文件系统——走进 Linux 的日常工作现场
第二课Linux 的工作现场——终端、Shell、文件系统与权限本课定位第一课回答了“Linux 是什么、为什么存在、内部大致有哪些层”。这一课开始进入每天真正使用 Linux 的现场你怎样向系统发出命令命令运行在哪里文件放在哪里为什么有些操作被拒绝以及串口和 SSH 到底分别连接到了什么。1. 本课目标学完本课后应当能够回答以下问题终端、终端模拟器、Shell 和命令分别是什么一行命令从敲下回车到出现输出经历了什么Linux 的路径、当前目录、绝对路径和相对路径分别是什么意思/home、/etc、/dev、/proc、/sys、/run等目录为什么存在用户、组、root、sudo和文件权限分别解决什么问题标准输入、标准输出、标准错误、管道和重定向如何组合串口 Shell、SSH Shell 与本机终端有什么共同点和不同点怎样在不破坏系统的前提下观察 Linux2. 你面对的不是“黑框”而是一条工作链刚开始使用 Linux 时终端窗口很容易被理解成“一个可以输入命令的黑框”。这不算错但太粗糙。实际至少有几层东西在协作键盘输入 ↓ 终端模拟器或串口程序 ↓ 字符流 Shell例如 Bash ↓ 解析命令、启动程序、建立管道和重定向 普通用户程序 ↓ 系统调用 Linux 内核 ↓ 文件、进程、终端设备、网络设备、硬件如果你通过 SSH 连接远端主机或通过串口连接一台无屏设备前半段会不同但 Shell、普通程序和内核之间的关系仍然相似。2.1 终端的历史含义早期大型计算机不一定自带显示器和键盘。用户通过电传打字机或独立终端与主机通信。终端负责输入和输出真正运行程序的是远处的主机。今天的图形化 Linux 桌面里常见的“终端窗口”通常是终端模拟器它用图形窗口模拟传统字符终端向其中运行的 Shell 传递字符并显示程序输出。所以“打开终端”并不等于“打开了 Linux 内核”。你通常是启动了一个图形程序它再为你启动一个 Shell。2.2 Shell 是命令解释器Shell 的原义是“外壳”。内核处于系统核心Shell 作为用户交互层帮助你读取输入的一行文本按规则拆分、展开和解释它找到要执行的程序创建子进程运行程序连接文件、终端、管道和网络输入输出等待结果并显示下一个提示符。Bash 是最常见的 Shell 之一还有 Zsh、Fish、Dash、BusyBoxash等。它们的交互体验和脚本语法有差异但都在做“把文字组织成程序执行”的工作。先查看当前 Shellprintf%s\n$SHELLps-p$$-opid,ppid,tty,comm,args这里的$$是当前 Shell 的进程号。第二条命令没有修改系统只是让ps显示当前 Shell 的 PID、父进程、关联终端和启动参数。2.3 提示符不是装饰你常会看到类似caigehost:~/work$它通常包含用户名、主机名和当前目录。末尾的符号也常表达权限$普通用户#root 用户。这是一种惯例不是内核强制规则。提示符可以被用户改成任何样子所以真正判断身份要使用idwhoami在不同系统的本地终端、SSH 会话或串口会话中可能看到userhost:~$ rootdevice:~#前者通常表示普通用户后者通常表示 root 用户。它说明你进入了某台机器的命令解释环境提示符的外观可以自定义真正的身份仍应以id的输出为准。3. 一条命令如何被理解先看一条简单命令ls-l/etc它可以粗略分成三部分ls -l /etc │ │ │ 程序名 选项 参数ls是程序名-l是选项要求使用较详细的列表格式/etc是参数告诉程序要列出哪个目录。Shell 并不“天然懂得”ls怎么列目录。它先按照自己的语法处理这行文字再根据PATH环境变量寻找可执行文件最后创建进程运行它。ls再通过系统调用请求内核读取目录内容。3.1 命令名从哪里找到查看搜索路径printf%s\n$PATH输出通常是一串用冒号分隔的目录例如/usr/local/bin:/usr/bin:/bin当你输入lsShell 会按顺序在这些目录中查找同名可执行文件。可以这样确认实际找到的是哪一个command-vlstypelstype特别有用因为一个名字不一定是独立程序它可能是 Shell 内建命令、别名、函数或外部可执行文件。typecdtypeechotypesudo通常cd是 Shell 内建命令。原因很直接改变目录必须改变当前 Shell 进程的状态。如果把cd做成一个独立子进程它只能改变自己的目录退出后你的 Shell 仍留在原地。3.2 引号、空格和通配符Shell 不会把输入机械地按空格切开它还要处理引号、变量、通配符和转义符。printf%s\nhello worldprintf%s\nhello worldprintf%s\nhello world第一条会得到两个参数后两条把hello world作为一个参数。单引号通常保留其中文字的字面含义双引号通常仍允许$变量展开。nameTaishanpiprintf%s\n$nameprintf%s\n$name通配符由 Shell 展开不是ls自己理解的printf%s\n/etc/*.conf这会在当前系统中匹配/etc下以.conf结尾的文件。因为匹配结果取决于真实文件请先把它当作观察命令不要对通配符匹配结果执行删除或覆盖操作。3.3 环境变量与当前目录环境变量是一组传递给新进程的名称和值。常见例子printfHOME%s\n$HOMEprintfUSER%s\n$USERprintfPATH%s\n$PATHpwdHOME是当前用户的家目录PATH决定命令搜索位置pwd显示当前工作目录。它们都属于用户空间约定不是“硬盘上的固定地址”。例如 root 的家目录常为/root普通用户的家目录通常在/home/用户名。4. 从/开始路径与目录树Linux 文件系统只有一个目录树根/。无论硬盘、U 盘、临时内存文件系统还是网络文件系统挂载后都会出现在这棵树的某个位置。/ ├── home │ └── caige ├── etc ├── usr ├── var ├── dev ├── proc ├── sys ├── run └── tmp4.1 绝对路径与相对路径以/开头的路径是绝对路径从整个目录树的根开始计算/etc/os-release /home/caige/workspaces不以/开头的路径是相对路径从当前工作目录开始计算notes/02-terminal-shell-filesystem-permissions.md ../materials两个特殊名字几乎每天都会用到.当前目录..当前目录的父目录。安全练习pwdlsls.ls..cd..pwdcd ..会改变当前 Shell 的工作目录。结束练习后可用cd -返回上一个目录或cd直接回到自己的家目录。4.2 文件名不是“文件类型”Linux 不通过扩展名强制决定文件类型。report.txt、program、Image都只是文件名。能否执行主要由权限位、文件内容、解释器声明和 CPU 架构共同决定。使用file观察真实类型file/bin/lsfile/etc/os-releasefile/dev/null你会看到普通可执行文件、文本文件和设备文件之间明显不同。设备文件后面会在第 6 节解释。4.3 隐藏文件Linux 中名字以.开头的文件或目录默认不会被普通ls显示ls-la~例如.bashrc常用于 Bash 的交互配置。它不是安全机制“隐藏”只是一种显示习惯。重要配置依然需要正确的权限和备份。5. 常见目录各自负责什么Linux 发行版之间会有差异但下表能帮助你读懂大多数系统。路径通常内容为什么你会关心/根目录所有路径的起点/home普通用户家目录个人代码、配置和文件通常放这里/rootroot 的家目录不等于整个根目录//etc系统级配置网络、服务、用户等配置常在这里/usr大量用户空间程序、库、共享资源/usr/bin、/usr/lib很常见/bin、/sbin基础命令的兼容入口现代发行版常把它们链接到/usr/bin、/usr/sbin/var会不断变化的数据日志、缓存、队列、数据库数据等/tmp临时文件文件可能被清理不适合放长期成果/run本次启动期间的运行状态PID 文件、套接字、临时运行信息重启后通常消失/boot引导相关文件普通 PC 常放内核和引导器配置嵌入式设备布局可能不同/dev设备节点串口、磁盘、终端等的用户空间入口/proc进程和内核状态的虚拟视图cpuinfo、meminfo、cmdline等观察入口/sys设备模型与驱动状态的虚拟视图网卡、GPIO、总线、模块、供电等观察入口/mnt、/media临时或可移动介质挂载点U 盘、数据盘常出现在这里/opt可选的附加软件第三方软件有时使用5.1/etc不是“所有配置都在这里”/etc是系统级配置的重要位置但今天的软件也可能在以下位置读取配置用户家目录中的.config//usr/lib/的默认配置/run/中运行时生成的配置/var/lib/中服务自己的数据内核命令行、设备树或固件文件。因此排错时不能只猜“配置一定在/etc”。要先看该程序的文档、日志和启动参数。5.2/proc和/sys不是普通磁盘文件下面命令读起来像打开文件cat/proc/cpuinfocat/proc/meminfo|headcat/sys/class/net/wlan0/operstate但/proc和/sys多数内容由内核在读取时动态生成不一定真正占据磁盘块。它们是内核向用户空间暴露状态和控制入口的接口。这也带来一个重要习惯有些虚拟文件可写而写入会立即影响内核行为。初学阶段先以读取为主。看到网上的echo 某个值 /proc/...或 /sys/...命令时先弄清它改变哪一项内核或设备状态再考虑执行。5.3/dev把设备呈现为可打开的对象例如ls-l/dev/tty*ls-l/dev/null /dev/zero/dev/ttyUSB0这类名字可能对应 USB 串口适配器/dev/ttyS*、/dev/ttyAMA*、/dev/ttyFIQ0等则可能对应 SoC UART。名字与驱动、硬件平台有关不能机械套用。/dev/null是一个经典设备写入它的数据会被丢弃读取通常立即得到文件结束。它适合说明“设备也可以通过文件描述符读写”不是让人随意丢弃有价值的输出。6. 文件系统、挂载和“磁盘在哪儿”“目录”和“磁盘分区”不是同一个概念。目录是文件系统命名空间中的位置分区是块设备上的一段范围文件系统是把块组织成目录、文件、权限和元数据的格式挂载是把某个文件系统接入目录树某一点的动作。块设备 /dev/nvme1n1p5 ↓ ext4 文件系统 ↓ 挂载 目录树中的 /你本机当前根文件系统正是一个 ext4 文件系统挂载在/。SDK 之前放在 NTFS 数据盘时厂商build.sh拒绝继续复制到 ext4 工作区后才通过检查。这个例子说明路径看起来像普通目录底层文件系统类型却可能影响权限、符号链接、大小写、时间戳和构建工具行为。安全观察命令findmnt /df-hTlsblk-ffindmnt /从挂载关系看根目录来自哪里df -hT看已挂载文件系统的容量和类型lsblk -f看块设备、分区、文件系统和挂载点。不要把df的输出理解成“物理磁盘的全部布局”。它只关注已挂载的文件系统而lsblk更接近设备和分区视角。7. 用户、组与 root为什么系统会拒绝你Linux 是多用户系统。即使你一个人使用电脑系统仍以用户身份、用户组和权限规则组织资源。进程以某个用户身份运行 ↓ 请求访问一个文件、设备或系统资源 ↓ 内核根据 UID、GID、权限位、ACL、能力与安全策略判断 ↓ 允许或者返回 Permission denied7.1 UID、GID 和组UID用户标识符GID主组标识符附加组用户还可以属于多个组用于共享权限。观察自己的身份idgroups在 Linux 主机上串口权限常通过dialout、uucp或发行版定义的其他组授予。不要因为“打不开/dev/ttyUSB0”就立刻使用 root先查看设备权限和自己的组。ls-l/dev/ttyUSB0id如果设备不存在上面的第一条会报错那通常意味着当前没有这个设备节点或名字不同而不是权限问题。7.2 root 是什么root 通常指 UID 为 0 的超级用户。它可以绕过很多普通的文件权限检查因此能做系统管理但也更容易把错误的命令作用到整个系统。root 不是“更懂 Linux 的用户”也不是普通操作的默认身份。日常编辑代码、查看日志和运行构建都应优先使用普通用户。需要明确的系统管理权限时再使用sudo获得短时间、单次命令范围内的提升。sudo-vsudosystemctl statusssh第一条可能要求验证你的密码但不修改系统第二条只是读取服务状态。sudo的含义不是“请永远相信我”而是“在允许的策略下以另一身份执行这条明确的命令”。7.3su与sudo的区别su 切换到另一个用户的 Shell sudo 某条命令 只以更高权限运行这一条命令 sudo -i 打开一个 root 登录式 Shell它们都可能获得高权限但使用场景不同。某些精简系统或恢复环境可能只提供 root Shell作为日常开发习惯应尽量让高权限操作短、小、可审查。7.4 文件权限的十个字符执行ls-l/etc/os-release可能看到类似-rw-r--r-- 1 root root ... /etc/os-release最前面的十个字符可这样读- rw- r-- r-- │ │ │ └─ 其他用户的权限 │ │ └───── 文件所属组的权限 │ └───────── 文件所有者的权限 └──────────── 文件类型- 普通文件d 目录l 符号链接等每组三个字符分别是rread读取wwrite写入xexecute执行。对于普通文件x常表示可作为程序执行。对于目录含义更微妙r可以读取目录条目列表w可以在目录中创建、删除或改名条目通常还受其他条件影响x可以穿过该目录访问已知名字的内容。所以目录缺少x时即使你能看到名字也可能无法进入或访问里面的文件。7.5chmod、chown为什么要谨慎chmod改权限chown改所有者。它们是必要工具但初学者不应把它们当成“权限报错万能修复键”。尤其要避免chmod-R777某个目录sudochown-R当前用户 /第一条会把目录树递归地开放给所有人读、写、执行第二条可能破坏整个系统的所有权和安全边界。遇到权限问题更好的顺序是确认实际目标路径没有拼错用ls -ld 路径查看目录本身的属主与权限用id查看当前用户和组判断操作本来是否应该由普通用户完成只对必要的一个文件或目录做最小改动。8. 标准输入、标准输出与标准错误每个普通进程启动时通常都带有三条最基本的文件描述符编号名称默认去向0标准输入stdin键盘或上游程序1标准输出stdout终端窗口或下游程序2标准错误stderr终端窗口程序把正常结果写到 stdout把错误或诊断消息写到 stderr。它们默认都显示在终端所以初看时很像同一种输出但 Shell 可以把它们分别接到不同位置。8.1 管道把一个程序的输出交给另一个程序iplink|less|会创建管道把左侧命令的标准输出送到右侧命令的标准输入。这个例子把较长的网卡信息交给less分页查看。再看一个findmnt|grep-Eext4|ntfs这不是魔法findmnt输出文本grep从文本中筛选包含ext4或ntfs的行。管道是 Unix 工具组合能力的核心之一。注意普通管道默认只连接 stdout。若左侧程序把错误写到 stderr它仍会直接显示在终端。8.2 重定向改变输入和输出的位置常见符号 文件 把标准输出写入文件会覆盖已有文件 文件 把标准输出追加到文件末尾 文件 让程序从文件读取标准输入 2 文件 把标准错误写入文件会覆盖已有文件 21 让标准错误去往标准输出当前去向为了理解先在自己可写的临时目录中练习mkdir-p~/tmp/shell-lessonprintffirst line\n~/tmp/shell-lesson/example.txtprintfsecond line\n~/tmp/shell-lesson/example.txtcat~/tmp/shell-lesson/example.txt真的会覆盖目标文件。把练习限制在新建的专用目录是为了让错误不会伤到项目文件或系统配置。保存命令的正常输出和错误输出ls/etc /path/that-does-not-exist~/tmp/shell-lesson/out.txt2~/tmp/shell-lesson/err.txtcat~/tmp/shell-lesson/out.txtcat~/tmp/shell-lesson/err.txt第二个路径故意不存在因此它的报错进入err.txt而/etc的正常列表进入out.txt。实际工作中这种分离很适合保存构建日志。8.3 不要迷信2121的意思是把 stderr 接到 stdout当前的位置因此顺序很重要commandlog.txt21这里两种输出都会进入log.txt。而command21log.txt会先让 stderr 指向当时的终端 stdout再把 stdout 改到文件结果可能不是你想要的。初学阶段只需要记住常见、安全的写法commandlog.txt219. 进程、前台与后台Shell 启动外部程序时程序会成为一个进程。进程不是“一个应用图标”而是一个正在运行、拥有 PID、地址空间、打开文件和权限身份的执行实体。观察当前终端中的进程ps-ef|headps-p$$-opid,ppid,tty,stat,comm,args9.1 前台任务前台任务通常占用当前终端Shell 等待它结束你的键盘输入也交给它。例如sleep30执行后30 秒内不会出现新的 Shell 提示符。按CtrlC会向前台进程组发送中断信号通常使它结束。CtrlC不是“关闭终端”而是终端驱动配合 Shell 和信号机制提供的约定。9.2 后台任务命令末尾加可以让 Shell 把任务放到后台sleep30jobs这适合短时间的交互实验。长期服务不应靠“终端后面挂一个”管理发行版通常使用 systemd、OpenRC 或 BusyBox init 的服务机制。9.3 进程与线程不是一回事初步理解即可进程通常拥有独立的虚拟地址空间和资源视图线程是同一进程内部可以并发执行的多个执行流。ps主要从进程视角展示信息某些参数可以进一步显示线程。以后你看到“SSH 连不上”“Wi-Fi 没起来”时需要区分是程序没有启动、启动后退出、仍在运行但配置错误还是内核驱动层根本没有设备。不要把所有问题都归为“程序卡住了”。10. 串口、SSH 与本机终端同一类交互不同链路无屏设备最容易混淆的地方之一是把“我打开了一个终端”误认为“我已经连上远端设备”。实际上终端窗口只是本机程序它到底连接到谁取决于底层链路。本机终端 图形终端模拟器 → 本机 Shell → 本机 Linux 内核 串口终端 串口程序 → USB-TTL / UART 字节流 → 设备串口 → 设备 Shell SSH 终端 ssh 客户端 → TCP/IP 网络 → sshd → 远端设备的伪终端与 Shell10.1 串口为什么是保底入口嵌入式 Linux 设备的调试串口通常可以看到 Bootloader、内核和用户空间启动日志。它不依赖Wi-Fi 驱动已经工作有效 IP 地址路由器或 DHCPSSH 服务已经启动根文件系统中的用户配置已经正确。因此当系统没有启动、没有网或 SSH 不通时先看串口。串口参数、信号电平和接线方式由具体硬件决定常见原则是 TX/RX 交叉、GND 共地且不能把不确定用途的供电引脚随意连接。10.2 SSH 为什么适合日常使用当系统已经能上网且 OpenSSH server 正常运行时SSH 比串口更适合日常开发复制文本方便可使用多个窗口可传输文件可进行远程编辑、Git 操作和调试不会被内核启动日志持续冲掉输入行。但 SSH 是更靠后的能力。它失败时应按层排查板是否启动、网卡是否出现、是否关联 Wi-Fi、是否获得 IP、是否能到达主机、sshd是否运行、账号和密钥是否正确。10.3 你在哪台机器上执行命令这是远程与嵌入式 Linux 学习中必须养成的习惯。每次执行命令前先问它运行在本机还是远端目标设备任务通常运行位置Git、编辑源码、交叉编译x86_64 Linux 开发主机build.sh、Buildroot、内核编译x86_64 Linux 开发主机查看 U-Boot/内核早期日志开发主机上的串口程序接收板端输出uname -a、ip link、挂载 rootfs远端 Linux 目标设备SSH 登录命令ssh 用户地址开发主机发起远端设备接收例如主机上的uname -m很可能输出x86_64而许多 ARM 设备上的同一命令会输出aarch64。命令一样观察对象不同。11. 帮助系统先问系统再问搜索引擎Linux 的命令往往选项很多死记硬背效率很低。先建立查帮助的习惯ls--help|lessmanlsmanhierman5passwd命令 --help快速列出该程序支持的选项man 命令查看手册页man hier某些系统提供目录层次结构说明man 5 passwd查看第 5 类手册页中的文件格式说明而不是同名用户管理命令。常见手册页分类章节通常内容1用户命令2系统调用3库函数4设备和特殊文件5文件格式与配置文件8系统管理命令嵌入式 Buildroot 系统通常比桌面发行版小未必安装man页面。这时可在开发主机查手册也可用命令 --help、项目文档和源码注释辅助理解。12. 一套安全的日常观察命令下面命令以“读取、列出、查询”为主适合作为刚开始的工具箱。12.1 身份与位置idhostnamepwduname-a12.2 文件与目录ls-lahfindmntdf-hTlsblk-f12.3 进程与服务ps-p1-opid,comm,argsps-ef|lesssystemctl--failed最后一条只适合使用 systemd 的系统。Buildroot 默认可能使用 BusyBox init因此没有systemctl并不代表系统坏了它只说明服务管理器不同。12.4 网络iplinkipaddressiprouteping-c31.1.1.1ping -c 3 1.1.1.1会发送三个 ICMP 回显请求。它适合在已知网络可用的环境测试连通性若网络策略禁止 ICMP失败不必然表示完全不能联网。12.5 内核与设备dmesg|tail-n80lsmodcat/proc/cmdlinels-l/sys/class/net不同发行版可能限制普通用户读取dmesg。不要为了看一眼日志就不加判断地把整台系统切到 root先理解该发行版的权限策略。13. 一次受控的小练习建立自己的实验目录学习命令时最好的习惯是把会产生文件的实验限制在一个明确目录中。下面示例只会在自己的家目录下创建内容mkdir-p~/linux-learning/lab-02cd~/linux-learning/lab-02pwdprintfhello from lesson 02\nhello.txtls-lcathello.txt接着观察权限和类型stathello.txtfilehello.txt最后验证标准错误分流lshello.txt missing.txtnormal.log2error.logcatnormal.logcaterror.log这个实验故意让missing.txt不存在。正常结果和报错分别写入两个文件请先读懂它们再继续下一步。练习完成后即使你删除整个~/linux-learning/lab-02影响也只在自己的练习目录内。14. 常见误解误解 1终端就是 Shell终端模拟器、SSH 客户端或串口程序负责传递字符Shell 是解释命令的程序。它们常一起出现但不是同一个东西。误解 2#就是“危险模式”#通常表示 root 提示符但提示符本身可以修改。真正关键是id的输出以及你准备执行的命令是否会改变系统。误解 3看见 Permission denied 就sudo权限被拒绝可能是路径错误、设备不存在、文件系统只读、ACL 或安全策略限制。sudo只能改变执行身份不能修复错误路径、坏驱动或只读介质。误解 4/root就是//是整个目录树的根/root只是 root 用户通常的家目录类似普通用户的/home/用户名。误解 5所有/proc、/sys文件都存在于硬盘它们大多是内核动态提供的虚拟接口。读取通常是观察状态写入可能立即改变系统或硬件行为。误解 6删除文件只和它所在目录的权限有关删除一个文件主要受父目录的写与执行权限控制而不是只看文件本身是否可写。这是初学权限时很反直觉的一点。误解 7管道会自动传递所有报错普通|默认只连接标准输出。标准错误仍会走向终端除非显式重定向。误解 8能 SSH 就不需要串口SSH 依赖目标系统、网络和服务都已正常。启动早期、Wi-Fi 故障或 rootfs 无法挂载时串口才是保底入口。误解 9所有 Linux 都有systemctlsystemctl是 systemd 的管理客户端。精简系统可能使用 BusyBox init其他发行版也可能采用不同初始化体系同样是 Linux 内核用户空间工具可以不同。15. 面向 Linux 项目的工作习惯从现在起把工作明确分成三类位置开发主机的家目录 ├─ 源码工作区例如 ~/workspaces/... ├─ 学习项目例如 ~/linux-learning/... └─ 临时实验例如 ~/tmp/... NTFS 数据盘 └─ 原始资料、下载包和参考副本 远端 Linux 设备 ├─ 串口用于早期启动日志与恢复 └─ SSH用于网络正常后的日常操作对应的规则是在适合项目要求的工作区构建软件原始资料、下载包和重要配置不随意改动远端命令先标明“这是在目标设备执行”带有,rm,dd,mkfs,mount,flash等写入或破坏含义的命令执行前先确认目标不因为方便而长期使用 root碰到异常先保存完整输出和当时所在机器再尝试修复。这几条听起来朴素却会直接决定之后排查“本机编译问题、网络问题、串口问题还是远端系统问题”时是否混乱。16. 本课总结终端程序负责字符输入输出Shell 负责解析命令和启动程序它们不是 Linux 内核。命令名、选项、参数、变量、引号和通配符都由 Shell 与程序共同处理。Linux 以/为唯一目录树根绝对路径从/开始相对路径依赖当前目录。目录、分区、文件系统和挂载是四个不同概念同一个路径背后的文件系统类型会影响软件行为。/dev、/proc、/sys是理解设备与内核状态的重要入口其中一些文件写入会立即产生影响。用户、组和权限是内核的资源保护机制root 权限应当短、小、明确而不是日常默认身份。stdin、stdout、stderr、管道和重定向让小程序可以组合成可靠的工作流。串口和 SSH 都能给你 Shell但串口覆盖更早的启动阶段SSH 依赖系统和网络已经正常。远程或嵌入式开发时先确认命令是在本机还是远端设备执行同一条命令在两处可能观察到完全不同的系统。17. 课后练习17.1 开发主机观察练习在 Linux 开发主机执行以下命令记录输出中的关键信息idpwdprintf%s\n$SHELLtypecdfindmnt /df-hTlsblk-fps-p1-opid,comm,argsiplink回答你当前是谁属于哪些组当前 Shell 是什么cd为什么不是普通外部程序根目录/位于哪个文件系统是什么类型PID 1 是什么程序主机上有哪些网络接口17.2 文件与重定向练习在~/linux-learning/lab-02中完成第 13 节实验再回答与的区别是什么为什么报错进入error.log而不是normal.log如果把2 error.log改成21结果会怎样为什么练习文件不应直接放在/etc、/usr或 SDK 源码根目录17.3 串口观察练习如果你有一台可通过串口登录的 Linux 设备且不改变任何设置可以执行idpwduname-mcat/proc/cmdlineiplink记录这些结果与开发主机的差异。不同设备的发行版、内核版本、目录布局、服务管理器和命令集合可能不同观察到差异是正常的先确认运行环境再解释结果。17.4 思考题为什么cd必须由 Shell 自己实现为什么/proc中的内容不一定占用真实磁盘空间为什么删除文件与父目录权限有关串口和 SSH 都能出现提示符它们最重要的差别是什么为什么 ARM 设备上的uname -m可能与主机不同却仍能由主机编译它的程序为什么第一版 Buildroot 要避免同时启用两套 SSH 服务18. 术语表术语含义Terminal终端今天常指终端模拟器或远程字符交互环境Shell命令解释器例如 Bash 或 BusyBox ashPromptShell 等待输入时显示的提示符PATHShell 搜索可执行程序的一组目录Working directory当前工作目录Absolute path从根目录/开始的路径Relative path相对当前工作目录解释的路径Filesystem组织文件、目录和元数据的格式与实现例如 ext4Mount将一个文件系统接入目录树某位置UID / GID用户标识符 / 组标识符rootUID 为 0 的超级用户stdin / stdout / stderr标准输入、标准输出、标准错误Pipe用|连接进程输入输出的内核机制Redirection使用、、等改变输入输出去向PID进程标识符TTY终端设备的统称也可指伪终端SSH基于加密网络连接的远程登录与命令执行协议UART通用异步收发器嵌入式设备常用作调试串口19. 延伸阅读Bash 手册https://www.gnu.org/software/bash/manual/GNU Coreutils 手册https://www.gnu.org/software/coreutils/manual/Linuxproc文件系统文档https://docs.kernel.org/filesystems/proc.htmlLinux sysfs 文档https://docs.kernel.org/filesystems/sysfs.htmlFilesystem Hierarchy Standardhttps://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.htmlLinuxpath_resolution(7)https://man7.org/linux/man-pages/man7/path_resolution.7.htmlLinuxcredentials(7)https://man7.org/linux/man-pages/man7/credentials.7.html下一课进程、服务与启动——从 PID 1、日志、systemd/BusyBox init到 Linux 如何从内核进入用户空间的过程。