Skip to content
This repository has been archived by the owner on Nov 4, 2022. It is now read-only.
/ myshell Public archive

A naive shell (course assignment for BUAA-UNIX).

Notifications You must be signed in to change notification settings

roife/myshell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

项目结构

|- err.h 错误处理宏定义
|- def.h 参数宏定义
|- main.c 主程序
|- ps.c 输出路径和命令提示符
|- parse.c 解析输入
|- cmd.c 运行命令

使用方式

$ cd myshell && make
$ ./myshell

功能概述

路径提示

对当前所在的路径进行提示,用绿色表示路径,用 $ 分隔命令和路径。

如图所示,还支持路径折叠(即将 HOME 目录折叠成 ~)。

cwd

多参数支持

multi args

字符转义

找到所有 "#include "*.h"

escaping characters

管道支持

统计 c 文件数量:

count c files

文件重定向

redirection

错误提示

内部命令 cd

cd

内部命令 exit:退出

exit

系统调用

ps.c

  • getcwd():获取所在路径
  • getenv():获取 $HOME 环境变量,用于路径折叠

cmd.c

  • chdir():进入路径,用于 cd 命令
  • exit():终止子进程
  • open()/close():打开/关闭文件描述符,用于文件重定向
  • dup2():复制文件描述符,用于文件重定向
  • execvp():调用命令
  • waitpid:主进程等待子进程结束并获取返回值

流程图

解析输入 (parse)

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

About

A naive shell (course assignment for BUAA-UNIX).

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published