Linux——命令行参数与环境变量

这里写目录标题

命令行参数

C语言的main函数是有参数的,argcargv的数量,argv为是指向一个个字符串的指针数组,例如当我运行以上的程序时,需要在终端上输入./test,就会出现

从这个例子我们就可以发现argv存储的是终端上输入的命令,也就是字符串,而argc存储的是命令的数量。

那么此时就衍生出了两个子问题

1.为什么需要这样做?

  1. 是谁这样做的

首先在终端上的命令本质上是一个个程序,而选项是一个个字符串,例如ls -l这样的命令,在arg[0]中的一般就是命令主体,而后面的就是选项,而一旦有了argvargc就可以对命令进行多个版本的编写。至于是谁这么做的,当我们输入命令时,首先拿到这些命令的是bash,因为bash是所有进程的父进程,而子进程又是可以继承父进程的数据的,所以bash可以将我们输入的命令传递给子进程的函数。

环境变量

环境变量的定义是最系统级的一些全局变量,具备不同的用途。

我们知道在执行命令时,Linux之所以能够直接执行,是因为Linux执行命令的默认路径是在/usr/bin下。

而环境变量之一的PATH中就是存储的这些路径,也就是说,操作系统查找可执行命令时,是在环境变量PATH中查找的。

上图我们可以知道PATH中存放的路径有哪些。我们自己写的程序需要执行必须加上路径,而如果不想加上路径,就有两种方法。第一把可执行程序放在/usr/bin路径下,第二种就是将可执行程序的路径,添加到PATH中。

在学习各种语言例如Python时就会出现配置环境的一步,其实就是为了能在任意路径都能启动Python,这里可能会将快捷方式与其搞混。快捷方式是为了方便用户在桌面上就启动程序,因为用户默认"出生点"是在桌面的,而快捷方式所实现的方式是将程序的路径拷贝到桌面上,可以理解为一个"超链接"(本质是包含程序路径、启动参数等信息的小文件,系统通过解析这个文件找到目标程序并启动 ),相当于点击该快捷方式其实是打开该路径。而环境变量是在任意路径都可以打开该程序。比如:

可以在cmd上打开Python,因为我将其添加到了PATH中,而虽然我有Chorm的快捷方式但我仍然不能再cmd上打开Chorm。

获取环境变量的方法

  1. 通过main函数进行获取,在前文提到了命令行参数,但main函数其实有三个参数

    第三个参数就是环境变量,也就是指针数组,其实是一个环境变量表,存放一个个环境变量的字符串

  2. 通过函数获取单个环境变量

    可以通过getenv函数进行查询某个环境变量。

  3. 通过C语言提供的全局变量来获取所有环境变量

    environ是一个二级指针,指向的就是环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

怎么获得环境变量的

在了解到获得环境变量的方法,但我的进程是怎么获得环境变量的呢?

并不是我的进程获取环境变量,而是我的父进程获取到环境变量!我的父进程是bash,当bash启动时,会读取系统的配置文件,进行malloc或者new出一个指针数组,将配置文件中的环境变量写入到指针数组里,形成环境变量表,这就说明该环境变量表是内存级别的,倘若进行更改,重启系统后会自动恢复,因为并没有更改系统的配置文件。而在bash启动完毕后,子进程会继承父进程的代码和数据,而环境变量表也是数据,所以子进程能够获取到环境变量。

环境变量的作用

不同的环境变量有不同的用处,像上述说的PATH就是提供路径让这些路径下的程序能在任意路径直接运行。还有类似PWDOLDPWD等环境变量,当我们输入命令pwd时会打印cwd(当前路径),而环境变量PWD的作用是会记录cwd,而OLDPWD会记录最近一次的路径,当我们输入命令cd -时就会回到最近的一次路径。

而进程是如何记录自己的工作路径的呢?
父进程bash的工作路径
自己的PCB中保存
以父进程为模版进行创建子进程

所以进程自己的工作路径从bash来!

bash的工作路径又从哪里来呢?通过系统调用函数getcwd(char*buf,size_t size),所以总体流程如下:
通过函数getcwd
父进程bash记录自己的cwd
自己的PCB中保存
设置bash自己的环境变量PWD
子进程以bash为模版进行创建
实时更新环境变量PWD

那么也就说明了并不是所有的环境变量都是从系统的配置文件读取的,也有一些部分是启动之后动态获取或创建。

环境变量的特点

环境变量拥有全局属性,当我们在bash上定义变量key = 10时,这是本地变量,而如果export key = 10时,这是环境变量,环境变量是可以被子进程继承,而子进程也是有子进程的,这样从bash创建的环境变量就可以被所有其子进程,孙子进程所使用,这就是环境变量的全局属性,而本地变量是不能的。

本地变量是只有在bash中才可以被使用的,但是当使用命令echo $key时,仍然可以打印出本地变量。这就有一个问题 ,echo这个命令要不要创建子进程呢?如果需要创建子进程,又是怎么获得的本地变量呢

大部分命令是可执行程序,需要通过创建子进程进行执行,而在Linux中有部分命令在执行时是没有风险的,需要bash自己执行,这就叫做内建命令,而echo虽然也在/usr/bin路径下,但他仍然是内建命令是不需要创建子进程的。

相关推荐
qinyia2 小时前
使用AI助手完成服务器系统备份迁移任务
linux·运维·服务器
知行合一。。。2 小时前
Linux--10---crontab -e定时任务
java·linux·运维
德迅云安全—珍珍2 小时前
如何去判断高防服务器的防御能力是否真实可靠?
运维·服务器
qq_273900232 小时前
Apptainer 将 Ubuntu 本地 Conda 环境打包为 Singularity(SIF)镜像
linux·ubuntu·conda
mljy.2 小时前
Linux《Socket编程UDP》
linux
云飞云共享云桌面2 小时前
非标自动化设备工厂如何2台服务器带动20个SolidWorks设计
运维·服务器·人工智能·3d·自动化·制造
好好学习天天向上~~2 小时前
2_Linux学习总结_基础指令
linux·学习
万博智云OneProCloud2 小时前
从 CloudEndure 到 HyperBDR:制造业企业如何重构 AWS 云容灾体系
运维·重构·aws
历程里程碑2 小时前
Linux 18 进程控制
linux·运维·服务器·开发语言·数据结构·c++·笔记