前言
Shell 是 Linux 系统的核心交互工具,本质上是一个命令行解释器。它接收用户输入,解析命令,创建子进程执行程序(或直接执行内建命令),最后返回结果。看似复杂的交互逻辑,核心依赖 fork、exec、wait 三大系统调用,再配合内建命令处理和环境变量管理,就能实现一个基础可用的 Shell。
一. Shell 核心工作流程
一个简易 Shell 的核心逻辑可以概括为'循环 + 五大步骤',无论复杂度如何,底层流程基本一致:
- 打印提示符:显示
[用户名@主机名 当前目录]#格式的提示符; - 读取命令:通过
fgets获取用户输入的命令行(如ls -l); - 解析命令:将字符串分割为命令名和参数数组(
argv); - 执行内建命令:对
cd、export等需 Shell 自身执行的命令,直接调用内置函数; - 执行外部命令:对
ls、ps等外部命令,创建子进程并通过exec加载执行,父进程等待子进程退出。
💡 关键区别:内建命令(如
cd)必须由 Shell 进程自身执行,因为子进程修改的工作目录不会影响父进程;外部命令则需创建子进程执行,避免影响 Shell 主进程。
二. 完整实现源代码
2.1 Makefile 文件
mybash: myshell.c main.c
gcc -o $@ $^
.PHONY: clean
clean:
rm -rf mybash
2.2 头文件(myshell.h)和 主函数(main.c)
myshell.h
#pragma once
#include <stdio.h>
// Shell 主循环函数
void bash();
main.c
#include "myshell.h"
int main() {
bash(); // 启动 Shell
return ;
}


