【Linux仓库】命令行参数与环境变量【进程·伍】

🌟 各位看官好,我是egoist2023

🌍 Linux == Linux is not Unix !

🚀 今天来学习命令行参数与环境变量的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦!

目录

命令行参数

意义

环境变量

罗列Linux环境变量

PATH

OLDPWD

PWD

多方法获取环境变量

main函数获取

​编辑

getenv获取

environ获取

​编辑

我的进程如何获取环境变量

环境变量全局属性

内建命令


命令行参数

**main函数可以有参数吗?可以有几个参数呢?参数又是什么呢?**带着这三个疑问往下阅读。

bash 复制代码
int main(int argc,char *argv[])
{
    printf("hello linux!\n");
    return 0;
}

我们或多或少在别人的程序中见过这种代码,清楚main函数是可以带参数的,并且可以有两个参数(实际上可以有3个参数,第3个是环境变量表)。那么这两个参数各代表什么含义呢?

  • argv是一个指针数组,它指向一个一个的字符串,最后以NULL结尾;
  • argc用来记录argv[]的元素个数。

我们的命令行参数会放到命令行参数表上,即argv,它用来存储命令行参数的每个单独的字符串。


意义

为什么要有命令行参数表呢?它能带来的意义又有哪些呢?

  1. 命令行参数传递:借助主函数的参数,能把命令行中用户输入的参数传递到程序内部,这样程序就能依据不同参数执行不同操作。
  2. 程序灵活性提升:无需对代码进行修改,通过命令行参数就能改变程序的运行方式或者配置信息。

从这两方面我们并不能体会到啊?因此小编写了段程序解释命令行参数带来的意义:

下图中写了一段程序,它借助main函数参数,让命令行参数传递的时候,通过匹配不同的命令行参数,如果第二个参数带的是v1则实现v1版本,带的是v2则实现v2版本,从而实现不同版本的逻辑,这带来的意义就是命令行参数传递实现不同的逻辑,同时我们也可以限制如果传递的命令行参数不符合我们的逻辑,则不能通过,提升了程序灵活性。

💻如图实现:

有没有一种可能我们之前所说的选项就是这样实现的呢?

是的没有错,Linux中许多指令也是借助了命令行参数才得以支持多模块实现,如ls指令。

bash 复制代码
ls -l -a -i

ls的命令本质是一个程序,而我们之前说ls后面的是选项,今天我们对选项能有更深的理解,它是通过命令行参数匹配从而实现我们的目的。

-l 、 -a 本质是字符串,以一定的方式传递给ls内部的"main",在ls内部实现的时候,就可以根据不同的选项,实现类似功能的不同表现形式。

因此我们对指令又有了进一步的理解:指令是特定目录上执行的二进制程序,而选项则是根据不同的参数传递给"main",实现不同表现形式.


环境变量

引出概念:

  • 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数 。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量是系统级别的一些全局变量 ,具备不同的用途(这也是为什么要有环境变量的原因)。

罗列Linux环境变量

那么该如何查看环境变量呢?

env 可以用来查看环境变量 , 这里主要讲三个重要的环境变量:PATH、OLDPWD、PWD.

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主⼯作⽬录(即⽤⼾登陆到Linux系统中时,默认的⽬录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

PATH

我们前面说过,指令也是一个可执行程序。为什么有些指令可以直接执⾏,不需要带路径,⽽我们自己的⼆进制程序需要带路径才能执行啊( 否则会报找不到 )这是为什么呢?

通过which命令查看ls所处的路径,可以看到是在/usr/bin的路径下。 什么意思呢 ? 即OS要执行该指令时,就需要/usr/bin路径,那么由谁给它提供呢 ? OS默认会在PATH路径下查找,若没有则会报错。而/usr/bin被包含在PATH环境变量中。

  1. 因此我只要证明 /usr/bin 不在PATH中时,此时再使用 ls 指令会向我们执行自己的程序一样报没有找到 ;
  2. 或者将我们自己的程序添加到PATH中,再执行自己的程序,若不会报错, 即可证明OS是在PATH中查找的。

💻扩展:

PATH的环境变量改变了,该怎么进行复原呢?重启xshell即可,因为环境变量是内存级的。

OLDPWD

OLDPWD环境变量用来记录当前用户最近一次所处路径。

💻证明: echo $OLDPWD可以展示最近一次所处路径.

PWD

这里总算可以解释pwd指令的原理了:

我们知道每个进程(包括xshell啊!)都会记录自己所处的工作路径,这在之前是已经验证过的.那么我们的PWD环境变量又从哪里而来呢?

pwd 会读取 当前进程所处的cwd.

💻pwd指令原理:

当你在 shell 里输入 pwd,其实是启动了一个新的进程,它继承了父进程(你的 shell)的 cwd。pwd 进程通过系统调用(如 getcwd())读取自己的 cwd,然后把它打印出来 。由于 pwd 进程和你的 shell 进程的 cwd 是一样的,所以你看到的就是你当前 shell 所在的目录。


多方法获取环境变量

获取环境变量的方法有很多,这里主要介绍三种:

main函数获取

我们前面说了main函数是可以带3个参数的,而第3个参数则是环境变量表.下图中

💻模拟实现env指令:


getenv获取

getenv是C语言库提供的函数,它可以用来获取单个环境变量


environ获取

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤
extern声明。(实际上environ就是个二级指针,指向环境变量表)


我的进程如何获取环境变量

我们大部分的指令以及自己实现的可执行程序,都不是有bash帮我们执行的,而是bash通过创建子进程的方式,让子进程继承了bash的环境变量,形成环境变量表。

问题1:为什么子进程可以继承bash的环境变量?

环境变量表是数据吗?是数据,并且是父进程的数据。子进程通常会继承父进程的代码和数据为副本,因此可以继承bash的环境变量。
问题2:bash从哪里获得环境变量的?

bash从系统的配置文件中获取,先会malloc环境变量表,解析配置文件的内容,把环境变量字符串依次放入到环境变量表里。

那么这就意味着bash一定会有两张表:

命令行参数表(一直在变)+ 环境变量表(比较稳定,内存级)

💻验证:

我们可以更改配置文件的信息,写入一段echo "哈哈,这个配置文件被执行了" 。则每次启动xshell时,bash都会从这个配置文件中形成环境变量表,在显示器上打印我们写入的信息。


输出结论:bash获取环境变量有两方面:配置文件 + 动态形成。

环境变量全局属性

  • echo:显示某个环境变量值
  • export: 设置⼀个新的环境变量
  • unset: 清除环境变量
  • set: 显⽰本地定义的shell变量和环境变量

环境变量是具有全局属性的,可以被子进程继承下去;

相对应的本地变量是不具备全局属性的,这种变量是不能被子进程继承。

💻下图中证明本地变量是不可以被子进程所继承的:

MYENV是本地变量,执行程序时bash创建子进程,子进程以父进程为副本进行继承,包括环境变量.假设本地2变量可以被继承下去,那么getenv获取该变量,如果打印该变量不存在说明本地变量是不能被继承下去的.

内建命令

我们知道命令是可执行程序,其中的大部分命令需要通过创建子进程的性质执行。

那么肯定也存在一些命令是不需要通过创建子进程来执行,而是由bash来执行.那么这个命令在执行的时候是没有风险的.我们把这种命令叫做内建命令!!!

💻echo 指令: 无论是本地变量还是环境变量,echo都能显式变量值。

我们说本地变量是不能被子进程继承下来的,说 明本地变量只在bash自 身有效,如果能打印出该变量的值,恰恰说明echo指令是一个内建命令。


相关推荐
打码人的日常分享1 天前
基于信创体系政务服务信息化建设方案(PPT)
大数据·服务器·人工智能·信息可视化·架构·政务
hoo3431 天前
【SolidWorks2025】3D CAD 软件:机械设计安装 + 补丁教程
linux
先知后行。1 天前
STM32常问问题
linux
G31135422731 天前
判断 IP 地址纯净度
服务器·网络
中电金信1 天前
云原生时代,应用运维模式如何破局?
运维·云原生
北京盛世宏博1 天前
如何利用技术手段来甄选一套档案馆库房安全温湿度监控系统
服务器·网络·人工智能·选择·档案温湿度
ringking1231 天前
docker源文件配置以及密钥文件
运维·docker·容器
Code Warrior1 天前
【Linux】传输层协议UDP
linux·运维·udp
Evan芙1 天前
Bash 变量命名规则与类型使用
linux·运维·开发语言·chrome·bash
濊繵1 天前
Linux网络--Socket 编程 TCP
linux·网络·tcp/ip