Linux-模拟一个简单的shell

什么是shell外壳?就是操作系统给我们的一个命令行解释器,在Linux系统中,它的shell叫做bash。

那么bash本质是什么呢?  本质就是一个文件,一个进程。    万物皆文件

每个操作系统的shell都是很复杂的,想要实现成本很大,那么,我们是否可以运用我们已学的进程方面知识来模拟一个简单的shell呢?

easy_shell

[username@VM-4-2-centos mydir]$ ls -a -l -d
drwxrwxr-x 2 owner group 4096 May 23 11:17 .
[username@VM-4-2-centos mydir]$ 

每次我们输入指令,它都会默认打印[username@主机名 mydir]$ 在前面, 所以我们可以这么写。

1528e6fb3b1f406dac7d8af95e9aa8d6.png

 当然,你也可以调用系统接口来输出你的用户名,主机名和所在文件夹。

8e7a6eb819224e0d8980209566054c27.png

 现在是否已经初见雏形了呢,那么如何去运行其他的程序呢?我们可以使用进程替换来实现!

按我们之前学的进程替换知识,使用execvp无疑是最合适的,可是他要传一个指针数组,我们的command是一个长字符串,所以我们需要将他解析入一个指针数组内,C语言提供了strtok的接口给我们。

358315a8a64f4753b78e7f03b3bcc49a.png

 现在我们来尝试一下,是否已经可以执行我们的程序了!

22a09f714c964185a29517d1ef8af0f8.png

 成功运行完毕!

需要注意的是,如果你不小心输错了内容,需要按住ctrl+删除 来进行删除

内建命令

虽然说,我们写的已经可以成功模拟了shell执行某些指令了,但是还是有一些指令会出现一些问题,比如说cd命令

d501626ba6ca4ecd92ae0f30a0c57cc6.png

我们使用pwd指令查看我们目前所在目录,使用cd .. 后本该返回到上级目录,可是为什么没有成功呢?

这是因为,我们执行cd命令,是使用的子进程来执行,我们的shell仍然在它当前的工作目录,所以我们应该怎么办?

像类似于这种需要shell自己来执行的命令,我们称之为内建命令,需要单独处理。

f48fa0eb4c01442f94a56e5a573fec68.png

 54a120075fcc4ef888871ba207bbd92a.png

3a9d6b0bde354a56826ad7d589bc4999.png

79b711a52d6c473aa77b6b0f3c84cffc.png

 成功返回了上级目录!

猜你喜欢

转载自blog.csdn.net/fengjunziya/article/details/130823624