-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhelp
114 lines (92 loc) · 6.17 KB
/
help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
[myshell用户手册]
一、基础命令:
1.cd
参数形式: cd <direction>
命令作用: 把当前默认目录改变为<directory>。如果没有<directory>参数,则显示当前目录。如该目录不存在,会出现合适的错误信息。这个命令也可以改变PWD 环境变量。
样例:cd /tmp
2.pwd
参数形式:无
命令作用:显示当前目录
样例:pwd
3.time
参数形式:无
命令作用:显示当前时间
样例:time
4.clr
参数形式:无
命令作用:清屏
样例:clr
5.dir
参数形式:dir <direction>
命令作用:列出目录<directory>的内容
样例:dir /home
6.set
参数形式:无
命令作用:列出所有的环境变量
样例:set
7.echo
参数形式:echo <comment>
命令作用:在屏幕上显示<comment>并换行(多个空格和制表符可能被缩减为一个空格)
样例:echo Hello world
8.help
参数形式:无
命令作用:显示用户手册,并且使用more命令过滤
样例:help
9.exit
参数形式:无
命令作用:退出shell
样例:exit
10.bg
参数形式:无
命令作用:将最近一个挂起的进程转化为后台运行
样例:bg
11.exec
参数形式:exec <command>
命令作用:用参数所代表的命令替换当前进程
样例:exec pwd
12.fg
参数形式:无
命令作用:将最近的一个后台进程转化到前台运行
样例:fg
13.jobs
参数形式:无
命令作用:显示所有后台进程
样例:jobs
14.test
参数形式:test <compare_1> <command> <compare_2>
test <command> <compare>
命令作用:通过command命令和compare_1,compare_2的组成不同,进行字符串或者数字的比较,command共8种(字符串相等=、字符串不等!=、数值相等-eq、数值不等-ne、数值大于-gt、数值大于等于-ge、数值小于-lt、数值小于等于-le) 另外,还有 -d -f等选项,来判断文件属性
样例:test abc = abcd
test 12 -eq 13
15.umask
参数形式:umask <new_mask>
命令作用:无参数时,显示当前掩码;有一个参数时,将当前的掩码改为参数值
样例:umask 0122
二、进阶操作
1.系统调用命令
当命令无法识别时,会自动认为是系统调用命令,并创建子进程用execvp命令进行系统调用
原理:当当前命令未被识别时,将命令转化为字符指针数组的形式,调用fork函数创建新的子进程,并用将函数返回值作为判断依据,分为子进程和父进程分开操作,在子进程中用execvp函数处理命令进行系统调用。
样例:ls -l
2.从文件中提取命令行读入
在运行myshell程序时,如果将文件名作为参数输入(仅限一个),就会默认文件为脚本,逐行读取运行
原理:在判断输入参数有且仅为一个时(不含myshell),将其作为文件名打开,若打开成功,保存文件标识符到script中。在读取命令函数readCommand中,若文件标识符不为NULL,则逐行读取文本内容作为命令行,并删除最后的换行符,转化为命令链表处理。处理完毕后继续读取文本,知道文本结束后结束进程。
样例:myshell test.sh
3.I/O重定向
在输入命令时,可以用标识">" "<" ">>" 来进行输入与输出的重定向。如果用">" ">>"将标准输出重定向outputpath文件中,输出就会输出到outputpath文件中,而非输出到屏幕上。同样,如果用"<" 将标准输入重定向到inputpath中,进程就会从inputpath中读取而非通过标准输入读取。
在setGlobalVarious函数中,检测到标识">" "<" ">>"后将其后面的参数保存到相应的全局变量中作为重定向路径
在处理命令前,用dup函数保存将要替换的标准输入或者输出文件标识符,并将路径文件打开,用dup2函数将标准输入或者输出改为用fileno转化后的文件描述符,在命令处理完毕后再用dup2函数将标准输入或者输出改回。
样例:time > test.txt
4.命令后台操作
myshell可以通过特殊符号&,将命令转换到后台进行操作,不影响前台继续输入命令
如果在命令行末尾以“&”结尾,会在setGlobalVarious函数中检测到并改变相应的全局变量
在处理命令最后,如果是外部命令,且认定为后台操作,就会用waitpid函数将该子进程用非堵塞的方式等待,并且调用jobList全局变量在任务栏中添加这个后台任务,然后继续运行主进程,开始新一轮读取命令。
样例:time &
5.管道操作
myshell可以使用“|”特征调用管道功能,将前一段的命令输出作为下一段命令的输入
如果在命令行末尾以“|”,会在setGlobalVarious函数中检测到并改变相应的全局变量,并保存后半段命令的链表头
在处理命令时,由于在结构里有commandCount,因此左边的命令不会出现错位的情况,右边的命令也一样,保存了链表头还有commandCount,能保证左右两边的命令正常运行。
在处理命令时,如果管道存在,就用fork函数创建子进程pid1,在子进程pid1中用pipeFile[2]创建管道,再在子进程中创建子进程pid2,在子进程pid2中将标准输出stdout转化为管道的输入端pipeFile[0],并关闭管道的输出端pipeFile[1],调用simple_function和execvp处理函数,并用exit退出进程。等待进程结束后,再在子进程pid1中将标准输入stdin替换为管道的输出端piprFile[1],并关闭输入端pipeFile[0],调用simple_function和execvp处理函数,并用exit退出进程。
样例:ls | wc
6.命令行提示符的输出
在每次读取命令行之前,调用负nction_showPath函数,通过getcwd函数得到当前路径,通过gethostname函数得到当前主机名,通过getuid函数得到用户信息(包含用户名),并在最后加上提示符$最后再一起输出作为提示符。
样例:fengjie@ubuntu:/home$