为了便于理解,本文从常用操作和概念开始讲起。虽然已经尽量做到简化,但是涉及到的内容还是有点多。在面试中,Linux 知识点相对于网络和操作系统等知识点而言不是那么重要,只需要重点掌握一些原理和命令即可。为了方便大家准备面试,在此先将一些比较重要的知识点列出来:
- 能简单使用 cat,grep,cut 等命令进行一些操作;
- 文件系统相关的原理,inode 和 block 等概念,数据恢复;
- 硬链接与软链接;
- 进程管理相关,僵尸进程与孤儿进程,SIGCHLD 。
# 一、常用操作以及概念
# 快捷键
30 秒速记
Tab:命令 / 路径补全,按两下列出候选,由shell处理Ctrl+C:给前台进程发SIGINT,程序可以捕获或忽略Ctrl+D:不是信号,空行时让读取方拿到EOF,意思是「输入结束」--help:只是传给程序的普通参数,有没有、长什么样由程序自己决定- 易错:拿
Ctrl+D去结束sleep没用,它只对正在读输入的程序有效
Tab 补全、Ctrl+C 中断、Ctrl+D 结束输入,这三个看着都是快捷键,其实归不同的层管。 Tab 是 shell 的补全功能;Ctrl+C 是终端驱动给前台进程组发 SIGINT 信号,程序没处理的话就退出;Ctrl+D 根本不是信号,它告诉正在读键盘的程序「没有更多输入了」,比如在 cat 或 node 交互环境里按一下就退出了。--help 又是另一回事,就是个普通命令行参数。分清这几层,碰到「按了没反应」才知道该往哪查。
- Tab:命令和文件名补全;
- Ctrl+C:中断正在运行的程序;
- Ctrl+D:结束键盘输入(End Of File,EOF)
# 求助
# 1. --help
指令的基本用法与选项介绍。
原理拆解: 这些操作分属不同层次:Tab 通常由当前 shell 的补全系统解释,根据命令名、路径或上下文生成候选项;Ctrl+C 会让终端驱动向前台进程组发送 SIGINT,程序可以终止、捕获或忽略它;Ctrl+D 本身不是信号,而是在规范输入模式下表示当前输入结束,空行时通常让读取操作得到 EOF。--help 则只是传给目标程序的普通命令行参数,是否支持以及输出格式由程序决定。
最小验证: 输入以下命令,分别验证帮助参数、输入结束和中断行为;运行 cat 后直接按 Ctrl+D,运行 sleep 后按 Ctrl+C。
printf '%s\n' '1. 查看命令帮助'
ls --help
printf '%s\n' '2. 启动标准输入读取,按 Ctrl+D 结束'
cat
printf '%s\n' 'cat 已收到 EOF'
printf '%s\n' '3. 启动等待,按 Ctrl+C 中断'
sleep 30
printf 'sleep 的退出状态:%s\n' "$?"
cat 后的提示出现,说明读取因 EOF 返回;sleep 被中断时,常见 shell 会显示非零退出状态,例如 130,但具体显示形式取决于 shell。ls --help 应输出用法和选项,而不是控制终端状态。
边界与排查: 补全规则会因 bash、zsh 及其插件而变化,候选项不一定仅是文件名。程序捕获 SIGINT 后可能继续运行,因此按一次 Ctrl+C 不保证退出。若终端设置、远程会话或按键映射被修改,可用 stty -a 检查 intr 和 eof 对应字符。部分命令不实现 --help,此时应改查 man 页面或命令自身文档。
面试官追问
追问 1前台跑着 sleep 30,按 Ctrl+D 能结束吗?
不能,sleep 根本不读标准输入,EOF 对它没意义。要用 Ctrl+C,退出码一般是 130(128 + SIGINT 的 2)。
追问 2按了 Ctrl+C,程序还在继续输出,键盘坏了吗?
大概率是程序自己捕获了 SIGINT,比如 Node 里写了 process.on('SIGINT', () => {}),信号到了但被吞了。可以再试 Ctrl+\(SIGQUIT),或者另开终端 kill -9 <pid>。
追问 3node 交互环境里,Ctrl+C 和 Ctrl+D 退出有什么区别?
Ctrl+D 是输入结束,REPL 正常退出;Ctrl+C 第一次只会打断当前输入,提示再按一次才退出。这就是信号和 EOF 被程序区别对待的直观例子。
追问 4某个命令 --help 报未知选项,怎么查用法?
试 -h、man 命令名,或者看官方文档。另外用 which 命令名 确认跑的是哪个二进制,macOS 自带的 BSD 版工具很多就不认 --help。
追问 5写 Node 服务时,为什么要处理 SIGINT 和 SIGTERM?
做优雅退出:收到信号先停止接新请求、等进行中的请求处理完、关掉数据库连接再 process.exit()。Docker 停容器发的是 SIGTERM,不处理就会等超时被 SIGKILL 硬杀。
# 2. man
30 秒速记
man=manual,查命令、配置文件格式、系统调用的完整手册DATE(1)里的数字是章节号,不是版本号- 常用章节:
1用户命令、5配置文件格式、8管理员命令(另有2系统调用、3库函数) - 同名条目靠章节区分:
man passwd是改密码命令,man 5 passwd才是/etc/passwd的格式 - 页内
/关键词搜索、n下一个、q退出;man -k 关键词按主题搜
man 就是命令行里的说明书,按章节组织,括号里的数字告诉你查到的是哪一类东西。 比如 man date 顶上显示 DATE(1),1 表示这是用户命令;第 5 章是配置文件格式,第 8 章是给管理员用的命令。同一个名字可能在好几章都有,最典型的是 passwd,直接 man passwd 打开的是改密码的命令,想看 /etc/passwd 文件格式就得写 man 5 passwd。精简的 Docker 镜像里经常连 man 都没装,这时候查官方文档更快。
man 是 manual 的缩写,将指令的具体信息显示出来。
当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下:
| 代号 | 类型 |
|---|---|
| 1 | 用户在 shell 环境中可以操作的指令或者可执行文件 |
| 5 | 配置文件 |
| 8 | 系统管理员可以使用的管理指令 |
原理拆解: man 查询的是按章节组织的手册数据库,而不是简单按文件名搜索。输入 man date 时,系统按既定章节顺序寻找名为 date 的条目,页面顶部的 DATE(1) 表示命中了第 1 章。章节号解决了同名歧义:一个名称既可能是普通命令,也可能对应配置文件格式或其他系统接口。第 1 章主要收录用户命令,第 5 章收录文件格式和配置文件,第 8 章主要收录系统管理命令。
最小验证: 输入以下命令,验证默认查询、指定章节以及按关键词搜索;这些命令只读取本机已经安装的手册数据库。
man date
man 1 date
man 5 passwd
man 8 shutdown
man -f passwd
man -k password
man 1 date 明确限定第 1 章,其结果通常与默认的 man date 一致;man 5 passwd 查询的是 /etc/passwd 文件格式,而不是修改密码的命令。man -f passwd 列出名称完全匹配的条目及章节,man -k password 按名称和简介中的关键词搜索,输出取决于本机安装内容。
边界与排查: 手册章节和页面是否存在取决于操作系统、软件包及语言包,某些机器可能没有 shutdown(8),精简容器甚至没有安装 man。出现 No manual entry 时,可先执行 man -f 或 man -k 检查条目,再确认相应文档包是否存在。指定章节时应写成 man 5 passwd,这样能避免默认搜索顺序命中同名但含义不同的页面;阅读时还可使用 /关键词 搜索,按 n 跳到下一个匹配,按 q 退出。
面试官追问
追问 1DATE(1) 里的 1 是版本号吗?
不是,是手册章节号,1 表示用户命令。同理 printf(3) 是 C 库函数,printf(1) 是 shell 命令,名字一样东西不同。
追问 2想看 /etc/passwd 的字段含义,man passwd 打开的却是改密码命令,怎么办?
写 man 5 passwd 指定第 5 章。不记得在哪章就先 man -f passwd,它会列出所有同名条目和章节。
追问 3只记得功能不记得命令名,比如想找跟压缩有关的命令?
用 man -k compress(等价于 apropos compress),按名称和简介做关键词搜索。返回空的话可能是手册索引没建,跑一下 mandb。
追问 4容器里 man ls 提示 No manual entry,是命令不存在吗?
不是,多半是精简镜像为了体积把文档删了,比如 Debian 的 slim 镜像默认就不装手册。命令照样能用,查文档用 ls --help 或者在宿主机上看。
追问 5手册太长,怎么快速找到某个参数的说明?
在阅读界面输入 /-r 回车搜索,n 跳下一个,N 跳上一个,看完 q 退出。这套键位和 less 一样,因为 man 默认就是用 less 显示的。
