|- err.h 错误处理宏定义
|- def.h 参数宏定义
|- main.c 主程序
|- ps.c 输出路径和命令提示符
|- parse.c 解析输入
|- cmd.c 运行命令
$ cd myshell && make
$ ./myshell
对当前所在的路径进行提示,用绿色表示路径,用 $
分隔命令和路径。
如图所示,还支持路径折叠(即将 HOME
目录折叠成 ~
)。
找到所有 "#include "*.h"
统计 c 文件数量:
getcwd()
:获取所在路径getenv()
:获取$HOME
环境变量,用于路径折叠
chdir()
:进入路径,用于cd
命令exit()
:终止子进程open()
/close()
:打开/关闭文件描述符,用于文件重定向dup2()
:复制文件描述符,用于文件重定向execvp()
:调用命令waitpid
:主进程等待子进程结束并获取返回值
graph TD
STR(str) -->|token| TOKENS(token_list) -->|parse| CMDS(commands)
graph TD
A(开始)
A --> EXIT(exit)
EXIT --> EXIT0[exit 0]
A --> CD(cd)
CD --> CHDIR[chdir 或报错]
A --> CMD(外部命令)
CMD -->|fork| CHILD( 子进程)
CHILD --> CHILDPIPE(管道重定向) -->|dup2| CHILDEXEC
CHILD --> CHILDFILE(文件重定向) -->|open + dup2| CHILDEXEC
CHILDEXEC(执行指令) -->|execvp| CHILDERR(判断错误 + 错误处理) -->|errno| CHILDEXIT(结束子进程并返回状态) --> CMDERR
CMD -->|waitpid| CMDERR(主进程错误处理反馈)
graph TD
A(开始)
A --> CREATEPIPE(创建管道 pipe)
CREATEPIPE --> P0(pipe)
STDIN(stdin) --> CMD1[执行命令 1]
CMD1 --> P0
P0 --> CMD2[执行命令 2]
CREATEPIPE --> P1(pipe)
CMD2 --> P1
P1 -->|...| PN(pipe)
PN --> CMDN[执行命令 N]
CMDN --> STDOUT(stdout)
项目开源在 roife/Myshell。