<commit_before>---
layout: post
title: "MyShell"
author: Zdf
tag: [shell]
category: shell
date: 2015-05-25 12:08:37 -0700
comments: true
---

#MyShell
---
##功能概述

一个简单的shell程序。实现了基本功能，包括一些内部命令，所有外部命令，支持标准IO重定向和管道。但是IO重定向和管道只能适用于简单的情况。

平台: Ubuntu14.04 </br>
运行MyShell即可进入shell，会出现`[MyShell] zdf@zdf-virtual-machine:~/MyShell$`类似这样的提示

###支持的内部命令

* _cd_  与linux下的cd功能相同：
</br>cd .. 返回上一级目录 
</br>cd 进入个人的主目录
</br>cd ~/directory 进入个人主目录下的目录
</br>cd directory 进入目录
* _exit/quit_  退出shell

实现此部分所使用的系统调用有`getpwuid`、`getuid`和`chdir`。

###支持所有外部命令

支持所有的外部命令，且支持参数

实现此部分所使用的系统调用有`execvp`。

###支持标准IO重定向

只能对第一条命令做重定向

实现此部分所使用的系统调用有`open`和`dup2`。

###支持管道

只能通过管道连接两个命令，例如`ls -l | sort`。所以一条命令中只能有一个`|`。

实现此部分所使用的系统调用有`fork()`、`pipe()`和`dup2`。

###其他

当输出重定向与管道同时存在时，管道命令只能放在最后，例如`ls -l > tmp | sort`。但是此时管道已经没有意义了。所以不建议输出重定向与管道共用。

##源代码

```c
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <sys/stat.h>
	#include <sys/types.h>
	#include <errno.h>
	#include <pwd.h>
	#include <fcntl.h>
	
	#define Max_Name_Len 256
	#define Max_Path_Len 1024
	#define Maxn 100
	
	char *argv[Maxn];
	int len;
	int fd[2];
	
	void type_prompt() {
		char hostname[Max_Name_Len];
		char pathname[Max_Path_Len];
		struct passwd *pwd;
	<commit_msg>updateMyShell<commit_after>---
layout: post
title: "MyShell"
author: Zdf
tag: [shell]
category: shell
date: 2015-05-25 12:08:37 -0700
comments: true
---

##MyShell
---
###功能概述

一个简单的shell程序。实现了基本功能，包括一些内部命令，所有外部命令，支持标准IO重定向和管道。但是IO重定向和管道只能适用于简单的情况。

平台: Ubuntu14.04 </br>
运行MyShell即可进入shell，会出现`[MyShell] zdf@zdf-virtual-machine:~/MyShell$`类似这样的提示

####支持的内部命令

* _cd_  与linux下的cd功能相同：
</br>cd .. 返回上一级目录 
</br>cd 进入个人的主目录
</br>cd ~/directory 进入个人主目录下的目录
</br>cd directory 进入目录
* _exit/quit_  退出shell

实现此部分所使用的系统调用有`getpwuid`、`getuid`和`chdir`。

####支持所有外部命令

支持所有的外部命令，且支持参数

实现此部分所使用的系统调用有`execvp`。

####支持标准IO重定向

只能对第一条命令做重定向

实现此部分所使用的系统调用有`open`和`dup2`。

####支持管道

只能通过管道连接两个命令，例如`ls -l | sort`。所以一条命令中只能有一个`|`。

实现此部分所使用的系统调用有`fork()`、`pipe()`和`dup2`。

####其他

当输出重定向与管道同时存在时，管道命令只能放在最后，例如`ls -l > tmp | sort`。但是此时管道已经没有意义了。所以不建议输出重定向与管道共用。

###源代码

```c
	#include <stdio.h>
	#include <string.h>
	#include <stdlib.h>
	#include <unistd.h>
	#include <sys/stat.h>
	#include <sys/types.h>
	#include <errno.h>
	#include <pwd.h>
	#include <fcntl.h>
	
	#define Max_Name_Len 256
	#define Max_Path_Len 1024
	#define Maxn 100
	
	char *argv[Maxn];
	int len;
	int fd[2];
	
	void type_prompt() {
		char hostname[Max_Name_Len];
		char pathname[Max_Path_Len];
		struct passwd *pwd;
	
{'fraction_non_alphanumeric': 0.16286388670338317, 'fraction_numerical': 0.02753737214791503, 'mean_word_length': 5.3734335839598995, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 33, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4793731', 'n_tokens_mistral': 1613, 'n_tokens_neox': 1635, 'n_words': 202}