自制简易SHELL

背景知识

1.首先完成shell提示符编写

在这个环节中,我们调用了getenv来获取环境变量USER和PWD。因为debian版本的环境变量中没有hostname环境变量,我们调用gethostname函数来获取hostname。

2.处理命令行的输入

我们使用fgets来完成一行的输入,当读到\n的时候结束。

我们将最后一个字符也就是\n用\0来替换,防止其打印\n,为后面分割字符串做铺垫。

argc和argv的获取

目标:将刚刚我们从命令行中获取的一段字符,分割成多个命令行参数。

注意此函数是第一次传入一个C字符串作为参数,此后不必传入字符串,并从上次停止的位置继续寻找delimiters中的字符;如果出现就再次截断该字符串。

3.正常命令创建子进程执行

注意我们进程替换的函数选择是从环境变量中寻找,并且命令行参数用数组存放的。

4.内建命令

1.cd命令

作用:切换当前工作目录

选择使用库函数getcwd()来获取当前的路径,这样不需要我们手动计算相对路径。

2.export命令

作用:设置或导出环境变量,使变量在当前 Shell 及其子进程中生效

说明shell把其当作内建命令而不是不同命令

我们直接调用库函数putenv()来向原本的环境变量中新添我们自身导入的环境变量。

但是我们后面再次进行env的时候发现我们导入的环境变量没有了,这是发生了什么?

原因:putenv不会复制输入的字符串,而是将指针插入到environ数组中,调用者必须保证该字符串(新添环境变量)的生命周期持续到程序结束或者后续修改,修改该字符串内容会直接影响环境变量。

Shell本身的环境变量是从哪来的?

当用户登录的时候,shell会读取用户目录下的.bash_profile文件,里面保存了导入环境变量的方式!

我们使用一个全局的二维数组来保存自己设置的环境变量,并且限制只能添加最多32个。

3.echo命令

作用:打印文本或变量的值到终端

echo需要特殊处理$?和$的情况

整体代码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值