环境变量,本地变量,命令行参数和内建命令

环境变量相关指令

        系统指令能够直接执行,自己编写好经过编译的程序需要加上前缀./才能运行,原因是在系统的一个名叫PATH的全局变量中存放了系统指令所在的路径:

        在当前路径下有一个编译好的可执行程序,command,将该程序的路径加入到PATH环境变量中,也可以像系统指令一样,不需要加./前缀就可以直接运行: 

         PATH=$PATH:【要添加的内容】

        添加好后自己编译的程序可以直接运行:

         要查看系统中所有的环境变量用env指令:

 HOME记录用户的家目录

HISTSIZE用于记录终端要保留的历史指令条数

SSH_TTY记录当前终端设备所在的路径。你可以打开另一个终端,向这个路径输出一些内容,他会在相应的终端中显示:

        

 LOGNAME记录当前登录的用户是谁

OLDPWD保存你上次所在的路径位置,cd - 指令能够直接回到上次所在的路径原因就在于系统变量保存了该路径。当你登录上shell后第一条指令执行cd -,就会提示你OLDPWD notset。

        你的代码程序需要获取环境变量时,可以通过系统调用:

 

        其次,C语言可以通过声明外部变量 enviroment来获取环境变量:

        向环境变量中新增一个变量用export:

        

        取消一个环境变量用unset:

命令行参数

        main()函数允许有指定的形参,int argc,char* argv[ ] ,用于保存程序运行时的的自定义选项:
        

        我们输入指令实际上是给系统输入了一串字符串,系统将该字符串以空格作为分割,来执行相应的程序,argc保存命令行参数字符串的个数,argv指针数组,一个向量表,保存命令行参数的内容:

        就像系统指令,ls -a ,ls -l等等,一样的程序可以执行不同的功能。main函数带参实际上就是为指令,软件,工具的使用提供选项支持。

        大多数的教材没有说main函数的第三个参数,char* env[ ],同样是一个数组指针或者叫做向量表,用来指向系统的环境变量:

通过三个main函数参数我们可以感知到,一个程序要变成进程,肯定是被别的程序调用并且进行传参。

还要指出一点,子进程是可以继承父进程的环境变量。我们在终端中运行的程序都是bash的子进程,bash在启动时,会从操作系统的配置文件中读取环境变量。

本地变量

        shell本身就是一个c程序,本地变量相当于在main中定义的一些局部变量,用set查看shell中的环境变量和本地变量:

        拿PS1='[\u@\h \W]\$ ',PS2='> '两个说,两个本地变量定义了shell显示命令行的格式,\u表示用户名,\h表示主机名,\W表示当前工作空间,也就是这个东西:

        PS2是一个续航提示符,完整的指令可以用 \ 间断,来到下一行继续输入,PS2就是提示符:

        shell程序本身的运行需要定义一些本地变量,这些变量只在shell的内部有效,不会被子进程继承。

        接下来我们在环境变量和本地变量的基础上引出内建命令的概念,从一个问题出发。

内建命令

        我们新建一个本地变量MY_VALUE,写一个程序用来查看它的值,然后再用echo查看它的值:

        我们编写的mycommand指令使用getenv系统调用查看不到本地变量,用echo却查看到了,这就说明,mycommand是shell的一个子进程,echo执行没有创建新的进程。

        shell的程序逻辑是,通过while循环捕捉用户输入,然后对用户输入的字符串进行解析处理,通过if判断输入的第一个字符串,也就是我们指令名,有些指令执行需要调用其他程序,那么就调用fork()创建一个新进程,在子进程中进行进程替换来完成相应指令功能的执行。而有些指令是一些简单的功能,就比如echo,这个时候我们选择在shell本进程中编写相应的功能而不创建新的进程调用其他的程序,这类的指令就叫做内建命令。

        总结:环境变量是一个进程运行时继承自父进程或者读取自操作系统配置文件一些全局变量,内容包含程序执行时极为重要的信息,有的用来记录当前程序执行的工作路径,有的用来识别用户身份来进行权限认定,有的来设置用户登录时的默认目录,有的来设置记录历史指令的条数。

        env查看当前系统的环境变量,set可以查看当前shell的本地变量和环境变量,echo $环境变量名,查看单一的环境变量值,export 用于将一个本地变量导出为环境变量,环境变量 = 环境变量:【新增内容】来覆盖式的修改环境变量值,unset用来取消环境变量的设置。

        main()的三个形参的主要用途是为指令或者一些软件工具提供命令行参数的支持。

        shell的常规命令通过新建进程来执行,一些命令诸如cd,echo作用在shell本身的或者简单的指令,无需创建进程而是在shell主程序中调用函数或者实现功能的指令被叫做内建命令。

        

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值