REPL 循环 · build your own shell
很多人把 Shell 等同于"那个黑窗口"。其实那个窗口是终端,Shell 是里面跑的程序——本质就是一个循环。
读:从输入读一行命令。解析:拆成命令+参数+管道+重定向。fork:复制一个子进程。exec:在子进程里换成要跑的程序。wait:父进程等子进程结束。然后回到读。所有 Shell 功能都是在这个循环的某一步加东西:管道在 fork/exec 之间插管道连接,重定向在 exec 前改文件描述符,信号在 wait 时处理。
下面是一个管道命令的执行过程,点"逐步执行"看 fork/exec/管道怎么按时序发生。
ls | grep txt 看似一条命令,Shell 实际做了:
所以一条管道命令 = 两个 fork + 一个管道 + 两次 exec。理解这个,N 段管道(ls | grep | sort | head)就是 N 个 fork + N-1 个管道,串起来。管道不是魔法,是文件描述符的连接。