【Linux系统编程】--命令行参数和环境变量

一、命令行参数

首先,有个问题:我们前面在学习语言的时候,C语言和C++的main函数是否可以带参呢?

答案是可以的。

其实我们的main函数是可以带如下这样的参数的:

其中crgc是表示的argv中有多少个字符串,argv是字符串数组。

那么其表示的啥呢?

可以发现,其和我们在Linux中的命令行的输入方式很像,前面表示我们的指令,然后后面表示我们的选项。

那么我们不妨大胆的猜测一下,我们的指令就是按照这样的方式,然后在代码中通过条件语句来判断要做的工作。

其实确实如此,我们也可以实验一下:

运行如下:

那么为啥要有命令行参数呢?

命令行参数的本质应用,就是为了实现一个命令,其可以根据不同的选项,然后去实现不同的功能,这也是Linux中所有的命令选项功能的实现方式。

补充:

1、命令行参数的个数至少是1,argc>=1,然后第一个是我们的指令,argc0是一定有元素的

2、选项之间是按照空格进程分割的,一个字符也是字符串

3、一共有argc个参数,那么argvargc==NULL

在我们Windows中,也是存在命令行参数的。

二、环境变量

1、初识环境变量

前面我们提到过一个问题,就是为啥我们要执行自己的程序的时候,要输入程序的路径。

这是告诉操作系统,我们要执行的程序在那里。那么我们也提到、我们可以将其弄得不需要告诉操作系统路径的方法,就是将文件挪动到一些指定路径下。

其实这些路径是保存在一个环境变量下的:

PATH。

那么我们可以通过下面的方法查看:

所以我们可以将我们的程序文件挪动到下面这几个路径下,那么执行的时候就不需要指定路径了。

可以看到我们此时就不需要带路径了。

但是这个方式,我们不推荐,因为这样会污染了系统的指令。

上面我们说到,当我们输入指令时候,没有带路径的话,那么就会去PATH环境变量中的路径中查找,那么我们是否可以将我们的目录也写入到这个环境变量呢?

下面我们来试试。

这个修改的方式是一个错误演示,可以发现我们将其改的只有我们后面=号的内容了。对于修改出错了,我们也不必慌张,只需要将我们的机器重启一下即可。

其就和我们在语言中对变量进行赋值一样,所以我们还要将原理的内容也加上,但是也不需要将其进行拷贝加上,我们只需要如下:

可以看到,我们上面只直接和我们的命令一样,不需要带指令就可以将我们的程序运行了。

实际上我们操作系统中,还有很多的环境变量,这些环境变量我们可以通过env指令将其打印到我们的屏幕上。

如下:

可以看到,有很多属性我们还是看得懂的,上面的环境变量往往是具有全局属性的,下面我们来认识几个环境变量:

1、**PATH:**就是我们进行输入指令的时候,没带路Linux的默认寻找路径

2、**USER:**当前主机的工作用户

3、**PWD:**就是我们当前的工作路径,所以我们使用的pwd指令,就是将这个环境变量打印到我们的显示器的

4、**SHELL:**就是我们当前使用的bash解释器

5、**HOME:**当前用户的加目录

那么这个环境变量是那里来的呢?

这个是从Linux系统的配置文件来的,后面我们对这部分进行详解。

实际上我们的C语言程序中,main函数还可以有第三个参数:

还有一个环境变量表的参数,那么这个本质就是将我们的环境变量表传给这个进程,那么这个工作是谁做的呢?

实际上是这个进程的父进程,那么我们在Linux环境下执行一个程序,那么其父进程就是bash。那么bash的环境变量表是那里来的呢?

其实在我们的Linux系统中,有一个配置文件,然后呢我们的机器每次打开,都会去先加载这个问文件。

在.profile文件中,会去打开.bashrvc文件,然后呢这个文件就是会去加载我们的配置文件了,我们可以实验一下,在这个文件中加一个语句echo "我打开了这个文件",然后我们重新将其开机,那么就会将这个打印出来,也就验证了我们的开机中是加载了这个文件的。

所以总的来说,在我们的Linux中,有一个磁盘文件,开机的时候都会将其加载到我们的bash进程中,然后我们在Linux中执行自己的程序,那么bash进程会将这个环境变量表传递给我们的程序的。

所以实际上,我们前面对于PATH的修改,只是修改的内存上的内容,并没有对实际文件进行修改,所以也是为啥,我们将机器开机重新开机,其PATH又恢复了。

那么我们如何进行获取具体的环境变量呢?

2、获取环境变量

我们有如下方式获取到环境变量。

首先第一种就是通过我们的env指令,那么就会将其所有的环境变量打印出来,然后我们可以通过grep指令对其进程筛选,然后查找到对应的环境变量。

然后我们可以echo $对应的环境变量,那么就可以获取到这个环境变量了,这个也是我们在命令行中最推荐的方式。

然后在我们C语言程序中也可以获取到对应的环境变量,我们有一个全局指针变量:

environ指针,其是一个二级字符指针char**,通过其可以查看对应位置的环境变量。

然后我们还提供了getenv,然后其参数就是一个字符串,传入要查找的环境变量名,然后就可以得到这个环境变量了。

然后我们也可以在我们的环境变量表中添加环境变量。

不过要注意的是,我们当前进程在环境变量表中添加的环境变量,是不会被子进程继承的,这是因为,这个修改是在内存级上的修改,并没有到磁盘内存中,所以我们后续关机重启,然后进程重新获取配置文件,那么又恢复原样了。

那么这种环境变量我们称为本地变量,然后其他的就是全局变量。

当我们切换一个进程后,是不会有这个环境变量的。

然后在我们的Linux中,对于命令也是有区别的,就比如当我们将PATH中的环境变量进行全部置空,那么有的指令我们是使用不了的了,但是还有的指令是可以使用的,这个就是shell中的内建命令,其是不依赖其他的第三方库的,是bash内部的一次函数调用。

相关推荐
kebidaixu18 小时前
BCU 平台 RS485 驱动适配:从 THVD1406 到 ISO3082
linux
杨浦老苏18 小时前
家庭实验室监控仪表盘HomeLab-Monitor
运维·docker·监控·群晖
回忆2012初秋19 小时前
【Nginx】原理、配置与运维实战(2)
运维·nginx·策略模式
Urbano20 小时前
工装外套全制作流程、工序痛点及自动化设备升级方案
运维·自动化
映翰通朱工20 小时前
工业4G网关无公网IP远程运维实战(内网终端异地访问方案)
运维·服务器·网络·安全·智能路由器
洪晓露20 小时前
将 rke2 集群证书延长至 10 年
运维·服务器·数据库
谢平康20 小时前
解决用 rm 报bash: /usr/bin/rm: Argument list too long错
linux·运维·运维开发
IP老炮不瞎唠21 小时前
Python 价格监控如何实现?思路与实用方法分享
运维·服务器·网络
GIS数据转换器21 小时前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
睡不醒男孩03082321 小时前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup