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

【Linux】命令行参数和环境变量

目录

一、命令行参数

二、环境变量

(一)PATH

(二)查看环境变量

(三)获取环境环境变量

(四)为什么要环境变量

(五)环境变量特点总结

(1)环境变量具有全局性

(2)内建命令


正文:

一、命令行参数

我们都知道,在调用函数时需要传参,平时我们接触最多的就是main函数。如下图

main函数可以有参数吗?可以有几个?是哪几个呢?

main函数是有参数的,有一个char* argv[ ]指向一个一个字符串的指针数组,最后以NULL结尾,和int argc 表示argv[ ]元素个数,那么argv[ ]到底指向谁呢?直接打出来看一下:

编译后,好奇怪哦,怎么输出的是我们在命令行输入的./a.out指令

那我再带个-a -b -c呢,最后发现我们命令行输入的是字符串,最后被人打散成“./a.out” “-a” “-b” “-c”然后依次放入argv中,所以argv[ ]用于存放命令行输入的参数,全是用空格隔开的字符串。

由此可见,我们在命令行输入的命令ls本质是程序,它后面跟着的-l -a叫选项,是一个个字符,可以通过一定的方式传递给命令行内部的main函数,在ls内部实现时就可以根据不同选项实现类似功能的不同表现形式。说人话就是:我们命令后面带的选项本质是通过命令行参数实现的

那输入这些命令时最先被谁获取到?父进程bash!!而你启动的所有程序都是bash的子进程,而父进程的数据通过fork()后是可以被子进程拿到的。所以我们进程启动时会默认维护一个数组,bash将命令行参数打散放入数组中以NULL结尾,这就是命令行参数表!!

结论:argv[]中至少有一个元素(程序名,如ls);进程的程序名字一般放argv[0];命令行上命令用空格隔开,有几个子串,argc就是几。

二、环境变量

(一)PATH

Windows操作系统上我们安装软件最头疼的莫过于配PATH环境了,什么乱七八糟的一堆

PATH是系统级全局变量,具有不同用途,目的是可执行程序路径查找。Windows和Linux下都有PATH

为什么装程序总要配环境呢?

因为你要执行一个程序系统得通过文件名+路径找到它。操作系统查找命令是在环境变量PATH中找!PATH包含了一串路径,如果在这全部路径中没找到执行指令的地址路径就报错!!

而没有配PATH我们要执行程序得自己把程序所在位置路径带上,比如打开Python你得输入它在C盘哪个文件中的.exe文件。每次这样输入太麻烦了,我就想在控制台输入个Python不带路径就打开Python,这时就体现配PATH的好处理:以后执行命令可以不带路径,它会自动找到拼上要执行程序路径直接运行,同时也做到了系统中随处可用(比如Linux中你在任何文件下输入ls命令)。

Linux中执行ls是在/usr/bin路径下找,而PATH包含了这个路径。

(二)查看环境变量

查看环境变量:env

env回车后可以看到进程环境变量,将全部环境变量可看成一个一个由K=V组成的字符串,系统会把环境变量通过指针数组形式维护成一张表,将字符串地址放入,就生成一张以NULL结尾的环境变量表。

(三)获取环境环境变量

方法一:main的第三参数获取

main函数其实还有第三个参数env这是一个指针数组,存放的是一个个环境变量,通过以下代码可以查看

方法二:getenv

getenv(环境变量名)获取单个环境变量

方法三:environ

这是C语言提供的一个全局变量指针,它是一个二级指针,直接指向我们上面的char* env[ ]

我们可以通过以上三种方法获得环境变量,这三种方法获得的环境变量从哪里来呢?

是进程启动时自动生成环境变量表,那么进程又是从哪里拿到环境变量生成环境变量表?

其实不是你的进程获得环境变量!是你的父进程(bash)获得环境变量生成环境变量表,而你当前子进程继承了父进程的环境变量表,所以对应也就看到了数据。bash获取环境变量是从系统的配置文件中来!!!

验证:

先cd ~到家目录下,ls -al查看所有隐藏文件,你会看到bashrc和bash_profile,通过vim查看两个文件看bash如何通过系统的配置文件获取环境变量。

以下是脚本,不用管,了解就行。

(四)为什么要环境变量

不同的环境变量有不同的用途,比如有些环境变量记录用户名,有些记录默认路径......

进程会记录下自己的工作路径(cwd),bash的cwd在自己的PCB内部保存,而bash自己要获取cwd时通过系统接口getcwd更新环境变量,getcwd是进程启动后动态获取的

所以:环境变量大部分从系统配置文件来,也有少部分是启动之后动态获取或创建

(五)环境变量特点总结

(1)环境变量具有全局性

通过父进程fork创建子进程,全部子进程都继承父进程的全局变量——全局性

(2)内建命令

bash自己内部定义的一个函数,通过函数调用执行不需要依赖环境变量表

Linux中大部分命令是可执行程序,需要通过创建子进程执行(ls...)有一部分命令执行时没有风险,需要bash自己执行叫做内建命令。

本次分享的重点在于:知道程序运行时会自动生成两张表,命令行参数表(一直在变)和 环境变量表(内存级的比较稳定)


希望利己的同时也利他,感谢阅读~下次再见

http://www.xdnf.cn/news/518923.html

相关文章:

  • 【PyQt5实战】五大对话框控件详解:从文件选择到消息弹窗
  • 【typenum】 11 私有模块(private.rs)
  • 【Redis实战篇】Redis消息队列
  • 10.9 LangChain LCEL革命:43%性能提升+声明式语法,AI开发效率飙升实战指南
  • 深入理解递归算法:Go语言实现指南
  • C44-练习
  • 全基因组关联研究揭示了脑淋巴活动的机制
  • Rstudio换皮:自定义彩虹括号与缩进线
  • Python Requests库完全指南:从入门到精通
  • 《C语言中的传值调用与传址调用》
  • 多头自注意力机制—Transformer模型的并行特征捕获引擎
  • 如何畅通需求收集渠道,获取用户反馈?
  • c++多线程debug
  • 【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】
  • 2.1.2
  • WaterStamp —— 一个实用的网页水印生成器开发记
  • 系统启动时开启选择内核菜单
  • ctf 基础
  • tauri2项目动态添加 Sidecar可行性方案(运行时配置)
  • 机器学习-人与机器生数据的区分模型测试 - 模型融合与检验
  • 关于机器学习的实际案例
  • C++学习:六个月从基础到就业——C++20:概念(Concepts)
  • ZZW-OCCT
  • OpenAI深夜发布Codex:AI编程里程碑式突破
  • 一:操作系统之操作系统结构
  • VS Code 开启mcp控制本地的redis
  • React 19中如何向Vue那样自定义状态和方法暴露给父组件。
  • 【方法论】金字塔内部的结构
  • 一文讲清 AWS IAM涉及的核心概念!
  • 【HALCON】 算子详解:create_local_deformable_model_xld 的全方位解读