复刻 UNIX Shell

复刻 UNIX Shell

2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

我们已经具备实现 UNIX 世界的全部机制

进程管理

  • fork, execve, exit

内存管理

  • mmap, munmap, mprotect

文件管理

  • open, close, read, write, lseek, dup

进程间通信

  • pipe, wait
2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

A Zero-dependency UNIX Shell (from xv6)

Shell 是 Kernel 之外的 “壳”

  • 它也是一个状态机 (同 minimal.S)
    • 完全基于系统调用 API

我们移植了 xv6 的 shell

  • 零库函数依赖 (-ffreestanding 编译、ld 链接)

支持的功能

  • 重定向/管道 ls > a.txt, ls | wc -l
  • 后台执行 ls &
  • 命令组合 (echo a ; echo b) | wc -l
2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

阅读代码

应该如何阅读代码?

  • strace
    • 适当的分屏和过滤
    • AI 使阅读文档的成本大幅降低
  • gdb
    • AskGPT: How to debug a process that forks children processes in gdb?
      • AI 也可以帮你解释 (不用去淘文档了)
    • 以及,定制的 visualization
      • 对于 Shell,我们应该显示什么?
2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

理解管道

center

2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

UNIX Shell: Traps and Pitfalls

达到平衡

  • “自然语言”、“机器语言” v.s. “1970s 的算力”

例子:操作的 “优先级”?

  • ls > a.txt | cat
    • 我已经重定向给 a.txt 了,cat 是不是就收不到输入了?
  • bash/zsh 的行为是不同的
    • 所以脚本一般都是 #!/bin/bash 甚至 #!/bin/sh 保持兼容
  • 文本数据 “责任自负”
    • 空格 = 灾难
2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

另一个有趣的例子

center

$ echo hello > /etc/a.txt
bash: /etc/a.txt: Permission denied

$ sudo echo hello > /etc/a.txt
bash: /etc/a.txt: Permission denied
2024 南京大学《操作系统:设计与实现》
复刻 UNIX Shell

展望未来

Open question

  • Shell (CLI/GUI) 的未来是什么

如果随时随地有大语言模型帮助?

2024 南京大学《操作系统:设计与实现》