11# ShellLab:构建 Unix Shell 🐚
22
3- ## 实验说明文档
4-
5- ### 1. 实验目标 🎯
3+ ## 1. 实验目标 🎯
64
75通过编写一个支持作业控制的 Unix Shell 程序,深入理解进程控制和信号处理的核心概念。
86
9- ### 2. 实验概述 📝
7+ ## 2. 实验概述 📝
108
119Shell 是一个交互式命令行解释器,负责接收用户指令并执行相应程序。本实验要求实现一个简化版的 Shell,包含基本的命令解析、进程创建、信号处理、作业控制和I/O重定向功能。实验提供了骨架代码和完整的命令解析器,你需要实现核心执行逻辑和控制机制。
1210
1311关于 Shell 原理和实现方法的详细指导,请参阅[ 实验指导文档] ( docs/guide.md ) 。
1412
15- ### 3. 实验要求 📋
13+ ## 3. 实验要求 📋
1614
17- #### 3.1 基本功能(必做)
15+ ### 3.1 基本功能(必做)
1816
1917- 命令提示符为 ` "tsh> " `
2018- 执行命令行程序(前台或后台运行)
@@ -23,19 +21,19 @@ Shell 是一个交互式命令行解释器,负责接收用户指令并执行
2321- 实现基本的 I/O 重定向(` < ` 、` > ` )
2422- 回收终止的子进程
2523
26- #### 3.2 内建命令
24+ ### 3.2 内建命令
2725
2826- ` quit ` /` exit ` :终止 shell
2927- ` jobs ` :列出所有后台作业
3028- ` bg <job> ` :将一个停止状态的后台作业转为运行状态
3129- ` fg <job> ` :将一个后台作业转为前台运行
3230- ` cd <dir> ` :切换当前工作目录
3331
34- #### 3.3 输出格式规范 📋
32+ ### 3.3 输出格式规范 📋
3533
3634为了确保自动化测试的正确性,你的 Shell 必须严格遵循以下输出格式:
3735
38- ##### 作业状态消息
36+ #### 作业状态消息
3937
4038- 后台作业启动:` [%d] (%d) %s & `
4139 - 例如:` [1] (12345) /bin/ls -l & `
@@ -46,22 +44,22 @@ Shell 是一个交互式命令行解释器,负责接收用户指令并执行
4644- 作业被信号终止:` Job [%d] (%d) terminated by signal %d `
4745 - 例如:` Job [1] (12345) terminated by signal 2 `
4846
49- ##### ` jobs ` 命令输出
47+ #### ` jobs ` 命令输出
5048
5149- 运行中的作业:` [%d] (%d) Running %s `
5250 - 例如:` [1] (12345) Running /bin/ls -l & `
5351
5452- 停止的作业:` [%d] (%d) Stopped %s `
5553 - 例如:` [1] (12345) Stopped /bin/ls -l `
5654
57- ##### ` bg ` /` fg ` 命令输出
55+ #### ` bg ` /` fg ` 命令输出
5856
5957- ` bg ` 命令输出:` [%d] (%d) %s & `
6058 - 例如:` [1] (12345) /bin/ls -l & `
6159
6260- ` fg ` 命令输出:不需要特殊输出,只显示命令本身
6361
64- ##### 错误消息
62+ #### 错误消息
6563
6664- 命令未找到:` %s: Command not found. `
6765 - 例如:` foo: Command not found. `
@@ -78,7 +76,7 @@ Shell 是一个交互式命令行解释器,负责接收用户指令并执行
7876- 作业 ID 不存在:` %%%d: No such job `
7977 - 例如:` %1: No such job `
8078
81- ### 3.4 附加任务(选做)🌟
79+ ## 3.4 附加任务(选做)🌟
8280
8381本实验提供多项选做任务,你需要** 任选两项** 完成:
8482
@@ -119,7 +117,7 @@ Shell 是一个交互式命令行解释器,负责接收用户指令并执行
119117
120118每项选做任务的详细要求及参考实现方法可参阅[ 实验指导文档] ( docs/guide.md ) 。
121119
122- ### 4. 文件结构与接口 🗂️
120+ ## 4. 文件结构与接口 🗂️
123121
124122项目采用模块化设计,文件结构如下:
125123
@@ -166,7 +164,7 @@ int parse_command_line(const char *cmdline, command_t **cmd, int *bg);
166164- `shell.c`: `eval`
167165- `signals.c`: `sigchld_handler`, `sigint_handler`, `sigtstp_handler`
168166
169- ### 5. 测试方法 🧪
167+ ## 5. 测试方法 🧪
170168
171169本实验提供了一个自动评测脚本,可以帮助你验证 Shell 实现的正确性。脚本支持多种测试模式,能够模拟用户输入、检查程序输出并提供详细反馈。
172170
@@ -181,7 +179,7 @@ python grader.py 5-jobs # 只运行特定测试点
181179./tshref
182180```
183181
184- #### 查看测试内容 🔍
182+ ### 查看测试内容 🔍
185183
186184如果想了解每个测试点具体执行的内容,可以运行:
187185
@@ -192,7 +190,7 @@ python grader.py -d 5-jobs
192190
193191你也可以直接查看测试点目录内容,每个测试点包含一个 config.toml 配置文件,描述了测试的元数据和执行步骤。
194192
195- #### 实用调试功能 🐛
193+ ### 实用调试功能 🐛
196194
197195这些功能可能也会对你有所帮助:
198196
@@ -215,38 +213,50 @@ python grader.py -d 5-jobs
215213 ```
216214 这将为失败的测试生成VS Code调试配置,让你能够在调试器中步进执行代码,观察变量值和程序状态。
217215
218- ### 6. 评分标准 💯
219-
220- - 基础功能实现(60%)
221- - 命令执行与进程管理
222- - 信号处理
223- - 作业控制
224- - I/O 重定向
225- - 代码风格与注释
226-
227- - 选做任务(20%)
228- - 任选两项[ 选做任务] ( #34-附加任务选做 ) 完成
229- - 或使用 Rust 实现
230-
231- - 实验报告与代码质量(20%)
232- - 实现思路清晰
233- - 关键功能分析
234- - 测试结果
235- - 代码结构合理
236- - 注释完善
237- - 错误处理充分
238-
239- #### 6.1 实验评优机制 🏆
240-
241- 为鼓励同学们追求卓越,本实验将评选出 3 份优秀实现并进行奖励:
242-
243- 评选将综合考虑必做部分的完整性与正确性、代码质量(包括架构设计、可读性和可维护性)、错误处理的全面性与健壮性、功能的完善度与实用性,以及实现的创新性与技术深度。这不仅仅关注选做任务的完成数量,更注重你对 Shell 核心功能的理解深度和实现质量。
244-
245- 获选的优秀实现将进行公示,并在征得作者同意后开源,供同学们参考学习。同时,优秀实现的作者将直接在平时成绩中获得 5 分附加分作为奖励。
246-
247- 参与评优无需额外申请,所有按时提交的作业都将自动纳入评选范围。我们期待看到你富有创意且高质量的 Shell 实现,展现你对操作系统概念的深刻理解和实际应用能力。
248-
249- #### 6.2 学术诚信 🔍
216+ ## 6. 评分标准 💯
217+
218+ ### 6.1 评分构成
219+
220+ 实验总分由以下三个部分组成:
221+ 1 . ** 功能正确性(50%)**
222+ - 评分依据:自动化测试通过率
223+ - 计算公式:$50 \times \frac{\text{测试得分}}{\text{测试总分}}$
224+ 2 . ** 实现方式与扩展功能(20%)**
225+ - 满分条件(二选一):
226+ - 使用 Rust 语言完成基础功能实现
227+ - 或使用 C 语言实现并完成至少两项[ 选做任务] ( #34-附加任务选做 )
228+ - 评分方法:
229+ - Rust 实现:基础功能完整即可获得全部分数
230+ - C 语言实现:每完成一项选做任务得 10 分,上限 20 分
231+ 3 . ** 实验报告与代码质量(30%)**
232+ - 实验报告评分要点(15%):
233+ - 实现思路清晰完整
234+ - 关键功能设计与分析深入
235+ - 测试结果分析全面
236+ - 问题解决过程与经验总结
237+ - 代码质量评分要点(15%):
238+ - 代码结构设计合理
239+ - 命名规范与注释完善
240+ - 错误处理机制健全
241+ - 实现的技术深度与创新性
242+
243+ ### 6.2 实验评优机制 🏆
244+
245+ 为了鼓励同学们追求卓越,本实验将对成绩排名前三的优秀实现进行特别奖励:
246+
247+ 评优标准将基于实验总评分,包含以下所有评分维度:
248+ - 自动化测试的功能正确性(50%)
249+ - 实现方式与扩展功能完成情况(20%)
250+ - 实验报告质量与代码设计水平(30%)
251+
252+ 获选的优秀实现将:
253+ 1 . 进行公示表彰
254+ 2 . 在征得作者同意后开源,作为学习参考资源
255+ 3 . 为作者提供平时成绩 5 分附加分作为奖励
256+
257+ 参与评优无需额外申请,所有按时提交且功能完整的作业均自动纳入评选范围。我们期待看到你精心打造的高质量 Shell 实现,展现你对操作系统概念的深刻理解与应用能力。
258+
259+ ### 6.3 学术诚信 🔍
250260
251261我们高度重视学术诚信,它是计算机科学教育的基石。我们期望你能够独立完成实验,真正掌握系统编程的核心概念和技能。
252262
@@ -264,7 +274,7 @@ python grader.py -d 5-jobs
264274>
265275> 我们使用代码相似度检测工具对所有提交的代码进行检查。一旦发现抄袭或其他学术不端行为,将严格按照学校相关规定处理。
266276
267- #### 6.3 关于 AI 工具使用 🤖
277+ ### 6.4 关于 AI 工具使用 🤖
268278
269279在现代编程环境中,ChatGPT、Claude、DeepSeek 等大型语言模型以及基于它们的工具(如 GitHub Copilot、Cursor 等)已成为许多开发者的辅助工具。我们认可这些工具在学习过程中的价值,同时也希望你合理使用它们:
270280
@@ -275,7 +285,7 @@ python grader.py -d 5-jobs
275285
276286合理使用AI工具可以增强学习效果,但最终的理解和代码实现应反映你自己的努力和思考。操作系统是计算机科学的核心领域,亲自实现这些机制将为你的技术成长奠定坚实基础。
277287
278- ### 7. 提交方式 📤
288+ ## 7. 提交方式 📤
279289
280290使用 GitHub Classroom 进行提交。请你确保所有代码已提交到你的对应仓库,GitHub Actions 会自动运行测试,其输出作为我们的评分依据。
281291
@@ -287,11 +297,11 @@ python grader.py -d 5-jobs
287297
288298请确保在截止日期前完成最终提交。GitHub 会记录你的所有提交历史,我们将以截止日期前的最后一次提交作为最终版本进行评分。
289299
290- # 8. 探索方向 🚀
300+ ## 8. 探索方向 🚀
291301
292302完成基础实验后,你可能会对 Shell 的原理和实现产生更浓厚的兴趣。本节提供一些探索方向,帮助你将实验 Shell 逐步打磨成一款真正可用的现代 Shell 工具。你可以在完成必做与选做后,根据自身兴趣与时间投入进行深度拓展。
293303
294- ## 8.1 交互体验增强 ✨
304+ ### 8.1 交互体验增强 ✨
295305
296306现代 Shell 的一大特色是提供丰富的交互体验。你可以考虑实现命令提示符的自定义与主题化,让用户能够展示当前时间、用户名、主机名、路径等信息,甚至支持彩色显示和动态更新。
297307
@@ -303,7 +313,7 @@ python grader.py -d 5-jobs
303313
304314语法高亮则能让用户在输入时直观地区分命令、参数、字符串等不同元素,甚至可以实时提示语法错误,大大降低使用门槛。
305315
306- ## 8.2 脚本与语言特性 📝
316+ ### 8.2 脚本与语言特性 📝
307317
308318Shell 不仅是执行命令的工具,也是一种编程语言。你可以为你的 Shell 添加内建函数或脚本模块化加载功能,让用户能够编写并调用复杂的功能模块。
309319
@@ -313,19 +323,19 @@ Shell 不仅是执行命令的工具,也是一种编程语言。你可以为
313323
314324高级管道和进程间通信机制也是 Shell 脚本能力的重要组成部分,你可以探索如何支持多重管道、管道与子 Shell 的结合使用等。
315325
316- ## 8.3 系统集成扩展 🔌
326+ ### 8.3 系统集成扩展 🔌
317327
318328真正实用的 Shell 需要与操作系统深度集成。PATH 管理与命令查找优化是一个很好的切入点,你可以支持在运行时动态添加、删除PATH中的条目,并将其持久化到配置文件。还可以使用缓存或哈希表对 PATH 下的可执行文件进行索引,加速命令查找。
319329
320330配置文件与插件系统可以大大增强 Shell 的可定制性和扩展性。你可以设计读取 ` ~/.tshrc ` 这样的配置文件,在启动时加载用户的环境变量、自定义函数、别名等设置。更进一步,你可以定义插件接口,允许用户通过动态库扩展 Shell 的能力。
321331
322- ## 8.4 性能与安全 🛡️
332+ ### 8.4 性能与安全 🛡️
323333
324334对于实际使用的 Shell,性能和安全同样重要。优化 Shell 的启动速度和内存占用是一个值得探索的方向,可以考虑懒加载部分功能,避免在初始化时进行大量预加载。同时,良好的内存管理可以防止在执行复杂命令或脚本时出现内存泄漏。
325335
326336在安全方面,你可以实现命令执行的权限控制和安全检查,如白名单/黑名单机制,防止执行某些高危操作。对命令执行路径和权限的严格检查则可以预防路径注入攻击。
327337
328- ## 8.5 参考资源 📚
338+ ### 8.5 参考资源 📚
329339
330340- [ POSIX Shell 标准] ( https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html )
331341 有助于理解 Shell 语法的最小通用规范和关键特性。
0 commit comments