当前位置: 首页 > news >正文

Linux进程——(4)命令行参数、环境变量

一、命令行参数

我们在平时用的ls等命令,其实每条指令都是一个进程,只不过很快就跑完了,后面跟的-l -a都是选项。这些指令貌似不需要我们传参就可以运行,但有的命令是需要传参的,我们回到C语言中的main函数来看一下。

我们平常用main函数几乎都是不写参数的,但实际main函数也是可以传参的,具体为

int main(int argc,char*argv[])

 这个参数具体有什么用呢?我们验证一下先。

结果显示argc为1,argv[0]是./code(一个字符串),但当我们输入./code 1运行时,agrc变成2了,argv[1]为1,argv[0]不变,当我们输入./code 1 2运行,argc为3,argv[2]为2。我们输入字符串运行也是如此,下图我们输入./code abcd xyz运行

我们把main函数的参数称为命令行参数列表。argc表示参数个数,argv是参数的清单。我们的命令后面跟的选项,其实就是根据这种原理实现的,把每个选项都看成传参,不同的参数代表不同的功能。它存在的意义就是同一个程序,根据命令行参数,不同选项,实现不同功能。那么main函数的参数是谁传递的?答案是shell,我们的参数就是一个个字符串然后被shell获取,按照空格分隔形成两张表argc和argv塞入数据,且对于数据(只读)子进程也能看到。

二、环境变量

其实,main函数不止两个参数,还有一个指针数组char*env[],我们先看一下里面都存放着啥

这些就是我们的环境变量,查找对应环境变量的内容我们输入echo $name即可。环境变量的作用是:操作系统在完成系统功能时需要的一些参数。 这些环境变量都在系统配置文件中,当我们启动shell时,会自动读取当前家目录下,形成对应环境变量。想查看所有环境变量输入env指令即可。我们来看一下常见的环境变量。

1.PATH

我们之前说过,我们想运行一个程序,需要./name而不能直接输入name,这是因为系统找不到,而为什么我们输入指令就可以不用带./呢?因为当程序要运行,系统会自动去/user/bin目录下找,而指令都在该目录下,但程序没有就找不到,但为什么系统知道命令在/user/bin下呢?就是靠PATH这个环境变量告诉shell要到此目录找。PATH中有很多路径,以:分开,系统就会在这些目录下寻找目标程序,因此PATH也叫路径集合。所以如果我们想直接输入name执行程序,要么cp到/user/bin下,要么把当前目录添加到PATH:

PATH=$PATH :当前目录

这个操作当我们重启后就会失效。

2.HOME

表明当前用户所在的家目录,我们启动系统时,系统会自动创建bash文件,bash读取环境变量相关的配置文件,然后HOME就会被设置,然后就会把bash的cwd设置成环境变量的家目录。所以我们登录时就会在自己的家目录下。

总之,我们可以借助系统的环境变量来实现一些功能,许多指令+选项的原理也是靠环境变量实现的。

3.环境变量的理解

环境变量是系统提供的具有“全局”属性的变量,就相当于C语言中的全局变量。与环境变量对应的还有本地变量。

本地变量相当于我们自己定义的变量,定义后也可以直接使用,当我们定义变量时候,语句相当于一个字符串被存放,当我们输入$时,系统会去保存的地方去匹配字符串并输出。我们如果想查看所有的本地变量可以输入set命令(查看所有的环境变量和本地变量)

其实我们可以把本地变量变成环境变量

export name

export的变量重启shell时会清除。 

当我们登录时,操作系统会创建一个当前用户的bash进程,bash会根据配置文件形成一张环境变量表(char*env[]),还会有一张argv表,还有一个本地变量表(存放本地变量的指针数组)。

我们也可以用export i=20直接放入环境变量,我们知道,我们启动的进程,是从父进程来的,因此环境变量是可以被子进程继承的,本地变量不能。(对于我们平常的程序都是子进程,他们的父进程是bash,当然,也可以被我们fork出的所有子进程看到使用,所以体现了全局性。)

取消环境变量的命令是unset name。

相关文章:

  • linux 安全 xshell 使用
  • 使用 GitHub 可重用工作流和 GitHub Actions 简化 DevOps
  • Flink SQL 技术原理详解
  • [cg][UE] Mali Streamline抓帧
  • 基于 MATLAB GUI 环境下的语音分析处理平台的设计与实现示例
  • 离开页面取消请求
  • Scikit-learn 完整学习路线(6-8周)
  • TDE透明加密:重塑文件传输与网盘存储的安全新范式
  • 【服务器】RAID0、RAID1、RAID5、RAID6、RAID10异同与应用
  • 如何提升AI模型正确率
  • 2025年3月19日 十二生肖 今日运势
  • 六级备考:词汇量积累(day9)
  • NewStar CTF web wp
  • OpenResty/Lua 编码指南/指南
  • Vue3:F12后,页面弹出runtime errors及提示的解决办法
  • Linkreate wordpressAI智能插件-自动生成原创图文、生成关键词、获取百度搜索下拉关键词等
  • OpenCV图像拼接(1)概述
  • 【2025新版本】【谷粒商城版】Kubernetes
  • PG数据库创建分区表
  • [Java微服务架构]1_架构选择
  • 蒲慕明院士:未来数十年不是AI取代人,而是会用AI的人取代不会用的
  • 一个留美学生的思想转向——裘毓麐的《游美闻见录》及其他
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 马上评|重病老人取款身亡,如何避免类似悲剧?
  • 巴菲特最新调仓:一季度大幅抛售银行股,再现保密仓位
  • 年在沪纳税350亿人民币,这些全球头部企业表示“对上海承诺不会变”