什么是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]$ 在前面, 所以我们可以这么写。
当然,你也可以调用系统接口来输出你的用户名,主机名和所在文件夹。
现在是否已经初见雏形了呢,那么如何去运行其他的程序呢?我们可以使用进程替换来实现!
按我们之前学的进程替换知识,使用execvp无疑是最合适的,可是他要传一个指针数组,我们的command是一个长字符串,所以我们需要将他解析入一个指针数组内,C语言提供了strtok的接口给我们。
现在我们来尝试一下,是否已经可以执行我们的程序了!
成功运行完毕!
需要注意的是,如果你不小心输错了内容,需要按住ctrl+删除 来进行删除
内建命令
虽然说,我们写的已经可以成功模拟了shell执行某些指令了,但是还是有一些指令会出现一些问题,比如说cd命令
我们使用pwd指令查看我们目前所在目录,使用cd .. 后本该返回到上级目录,可是为什么没有成功呢?
这是因为,我们执行cd命令,是使用的子进程来执行,我们的shell仍然在它当前的工作目录,所以我们应该怎么办?
像类似于这种需要shell自己来执行的命令,我们称之为内建命令,需要单独处理。
成功返回了上级目录!