【Linux 学习计划】-- 命令行参数 | 环境变量

article/2025/8/10 8:45:21

目录

命令行参数

环境变量

环境变量的本质是什么?

相关配置文件

修改环境变量的相关操作

代码获取env —— environ

内建命令

结语


命令行参数

试想一下,我们的main函数,也是一个函数,那么我们的main函数有没有参数呢?

有的兄弟有的,main函数其实可以有三个参数,但是现在我们只讲其中两个,因为最后一个和下文要讲的环境变量有关

而前两个分别是argc和argv,不理解没关系,我们直接来看代码:

我们可以看到,我们命令行上的参数,直接在执行文件后面加的东西,会直接被main函数的两个参数给捕捉到

其中,argc就是后面加上的参数的数量加上执行文件的名字本身

而 argv 则是这些变量的具体字符串

那么这些个参数具体有什么用呢?换句话说,看到这样子的执行方式,有没有感觉有一点熟悉

这不就是我们指令的执行方式吗?!!

我们的 ls -a -l,rm -r -f 等等,这些都是执行文件加上指令啊!

所以,main函数参数的本质其实就是分配给一个可执行文件的不同任务,每一个任务都有对应的效果,写一个小代码就明白了:

而这些工作在未来,都是交给子进程去做的

但是有一个问题,进程不是互相之间独立的吗?为什么子进程能做?main函数在外面的命令行参数,本质上不是传给父进程的吗?

这其实是后面关于程序地址空间的相关内容,这里不做介绍,只需要知道——子进程刚创建的时候,数据都是拷贝自父进程的,所以子进程能有一样的数据,也就能够使用、执行对应的任务了

但是由于是拷贝,所以子进程能够看见父进程的数据,但是父进程看不到子进程的

环境变量

先来看一看环境变量中的 PATH:

这个路径,就是平常程序要找相关可执行文件(指令)时候会找的路径

换句话说,我们平常写完可执行程序之后,都需要 ./XXX进程运行,但是指令则不需要,这是因为默认环境变量中的PATH已经将这些路径给记录下来了,所以不用./

所以,只要我们将自己的路径放在里面,我们的程序也能不用 ./ 而是直接执行是吗?yes

环境变量的本质是什么?

在程序开始之前,由于我们的bash(命令行解释器)也是一个进程,所以系统会将部分文件直接加载进bash进程之中,通过什么方式?mian函数的命令行参数!!(这个在下文讲)

相关配置文件

当我们来到自己的家目录下,我们可以看到里面有两个隐藏文件,我们可以打开其中的.bash_profile

我们可以清楚地看到第10行,这里面就是我们的PATH地址

而我们现在在这后面加上我们自己的地址,这时候就代表:

因为系统在我们登录的时候,就是将着些个文件加载进bash进程之中,所以我们现在每一次登PATH 都会是这样

之前的由于我们只是在bash进程内部,比如说用PATH=$PATH:自己的地址  这样的方式进行更改,在我们退出登录之后,他就没了,下一次登录就是默认的样子,因为这只是内存级的

现在我们改完配置文件之后重新登录:

就可以看见,确实是生效了

修改环境变量的相关操作

首先是查看,这里我们用 echo $XXX 来查看对应的环境变量,其中XXX代表某个环境变量的名字

如果我们想要一键查看所有环境变量的话,我们可以直接使用 env 进行查看:

其中我们也可以看见一些熟悉的变量

接着,如果我们想将一个新的变量变成环境变量的话,我们可以使用export name,反之如果不想让其当环境变量了,就可以使用unset name来进行修改

用了unset之后,确实就没有了

注意,上面这些都是命令行获取环境变量的相关操作

首先,这些操作都是内存级的。下次登录的时候默认就恢复了,所以可以随便改(别改到配置文件就好)

其次,我们还可以使用代码获取对应的环境变量,比如environ,getenv("name")这样的方式,这些我们放在下文,穿插在知识点里面进行讲解

代码获取env —— environ

我们来看这么一个代码,environ 具体是什么我们待会儿说,先来看效果:

这是我们程序运行的结果,可以看到,这不就是我们刚刚直接用env指令看到的环境变量吗?

但是,为什么我们能通过指令来看到这些环境变量呢?

首先,环境变量是从磁盘的配置文件,在我们登录的时候加载进bash进程里面的

今天我们写了一个新进程,而这个进程必然是bash用fork创建出来的子进程,后面在学地址空间的时候就会知道,子进程的数据就是拷贝自父进程的

那么这个时候,我们自然就能够看到父进程(bash)的相关数据咯

至于是怎么看到的?里面的environ,就是 char* envp[ ] ,也就是我们前文提到的main函数的第三个参数

我们可以这么理解,在bash进程启动的时候,默认会给子进程创建两张表,一张是argv也就是指令表,还有一张就是环境变量表——即环境变量也是被管理起来的

而这个environ,就是这个环境变量表的头指针

这也就是为什么我们在代码就能够获得环境变量

那还有别的用代码获取环境变量的方式吗?这样一次性获取太多了,我要固定获取某一个环境变量的方式有吗?

有的兄弟有的 —— getenv("name")

比如这样写,但是需要注意的是,这个函数需要包含头文件stdlib.h

综上,我们现在获取环境变量的方式有三种:

  1. environ指针
  2. main函数参数
  3. getenv

内建命令

不知道各位在上面看到export的时候,有没有觉得有些奇怪

export不是一个指令吗?那照我们前面学的,bash会开一个子进程来执行他

但是,子进程可以看见父进程的数据,因为子进程的创建就是拷贝自父进程

但是我们今天用export将变量变成环境变量,这样父进程不是看见了子进程的数据吗?这对吗兄弟?

对的兄弟对的,因为export这样的命令并不是普通的命令,他有一个一个名称叫做内建命令

如果说别的比如 ls 指令,是通过fork然后让子进程跑起来,那么export就好像直接是void export()这样,直接写函数实现,所以他根本就没有创建子进程,这也就是为什么变量能变成环境变量

比如echo也是一个内建命令

我们可以做一个测试,我们的PATH不是负责管理指令的路径吗?如果PATH直接变成空,那么所有的普通指令不就跑不了了吗:

结语

这篇文章到这里就结束啦!!~( ̄▽ ̄)~*

如果觉得对你有帮助的,可以多多关注一下喔


http://www.hkcw.cn/article/UJcddiZcUX.shtml

相关文章

尚硅谷redis7 90-92 redis集群分片之集群扩容

90 redis集群分片之集群扩容 三主三从不够用了,进行扩容变为4主4从 问题:1.新建两个redis实例,怎么加入原有集群?2.原有的槽位分3段,又加进来一个槽位怎么算? 新建6387、6388两个服务实例配置文件新建后启…

Proteus寻找元器件(常见)

一 元件库 二 找元件 1 主控 32 51 输入 stm32 AT89c51 2 找屏幕 oled 3 找按键button 4 电阻、电容 res cap 5 电机驱动 l298n 6 电机 motor 7 滑动变阻器 pot 8 找电源和 GND 9 找晶振 选择 D 开头的 CRYSTAL 10 网络标签

修改Cinnamon主题

~/.themes/Brunnera-Dark/cinnamon/cinnamon.css 1.修改 Tooltip 圆角大小,边框颜色,背景透明度 #Tooltip { border-radius: 10px; color: rgba(255, 255, 255, 0.8); border: 1px solid rgba(255, 255, 255, 0.6); background-color: rgba(0,…

从一到无穷大 #46:探讨时序数据库Deduplicate与Compaction的设计权衡

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言Compaction AlgorithmsCompact Execution Flow Based On VeloxLocalMergeSource的…

突破DIFY沙箱限制,高效处理大文件

DIFY获取传入文件路径并处理文件内容 由于dify代码沙箱自身的安全限制,用户在沙箱环境下的代码无法实现对系统文件的写入和读取操作。如果想利用dify来处理文件数据,就不得不使用官方提供的文档提取器插件,但是使用该插件提取如.xlsx,.csv等…

比较云计算的四种部署模式:哪个是最佳选择?

在数字化转型浪潮中,企业面临的关键决策之一是如何选择云计算部署模式。公有云、私有云、社区云和混合云并非简单的技术选项,而是关乎业务架构的战略选择。每种模式都代表着不同的资源控制程度、成本结构和安全边界,理解其本质差异是制定有效…

云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)

云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作) 目录 云计算Linux Rocky day02(安装Linux系统、设备表示方式、Linux基本操作)1、虚拟机VMware安装Rocky2、Linux命令行3、Linux Rocky修改字体大小和背景颜…

项目管理工具Maven

Maven的概念 什么是Maven 什么是依赖管理 对第三方依赖包的管理,可以连接互联网下载项目所需第三方jar包。 对自己开发的模块的管理,可以像引用第三方依赖包一样引用自己项目的依赖包。 什么是项目构建 一、项目构建的定义 项目构建是将源代码经过编…

使用原生前端技术封装一个组件

封装导航栏 navbar-template.html <header><nav><ul><li><a href"index.html"><i class"fas fa-home"></i> 主页</a></li><li><a href"#"><i class"fas fa-theate…

mac mini m4命令行管理员密码设置

附上系统版本图 初次使用命令行管理员&#xff0c;让输入密码&#xff0c;无论是输入登录密码还是账号密码&#xff0c;都是错的&#xff0c;百思不得其解&#xff0c;去网上搜说就是登录密码啊 直到后来看到了苹果官方的文档 https://support.apple.com/zh-cn/102367 https…

使用Vditor将Markdown文档渲染成网页(Vite+JS+Vditor)

1. 引言 编写Markdown文档现在可以说是程序员的必备技能了&#xff0c;因为Markdown很好地实现了内容与排版分离&#xff0c;可以让程序员更专注于内容的创作。现在很多技术文档&#xff0c;博客发布甚至AI文字输出的内容都是以Markdown格式的形式输出的。那么&#xff0c;Mar…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…

【ABAP 基本数据类型】

ABAP 基本数据类型 一、数值类型 1.1 整数类型 类型关键字长度值范围示例代码标准整型I4字节-2,147,483,648 到 2,147,483,647DATA lv_int TYPE i VALUE 100.短整型INT22字节-32,768 到 32,767DATA lv_short TYPE int2 VALUE -500.无符号整型INT11字节0 到 255DATA lv_flag T…

LearnOpenGL-笔记-其十一

Normal Mapping 又到了介绍法线贴图的地方&#xff0c;我感觉我已经写了很多遍了... 法线贴图用最简单的话来介绍的话&#xff0c;就是通过修改贴图对应物体表面的法线来修改光照效果&#xff0c;从而在不修改物体实际几何形状的前提下实现不同于物体几何形状的视觉效果。 因…

Scratch节日 | 粽子收集

端午节怎么过&#xff1f;当然是收粽子啦&#xff01;这款 粽子收集 小游戏&#xff0c;让你一秒沉浸节日氛围&#xff0c;轻松收集粽子&#xff0c;收获满满快乐&#xff01; &#x1f3ae; 玩法介绍f 开始游戏&#xff1a;点击开始按钮&#xff0c;游戏正式开始&#xff01;…

Linux(9)——进程(控制篇——下)

三、进程等待 1&#xff09;进程等待的必要性 之前提过子进程退出&#xff0c;父进程如果不读取子进程的退出信息&#xff0c;就可能造成“僵尸进程”的问题&#xff0c;从而造成内存泄漏的问题。再者&#xff0c;一旦子进程进入了僵尸状态&#xff0c;那就连kill -9都杀不亖…

Scratch节日 | 六一儿童节

六一儿童节到啦&#xff01;快来体验这款超简单又超好玩的 六一儿童节 小游戏吧&#xff01;只需要一只鼠标&#xff0c;就能尽情释放你的创意&#xff0c;绘出属于你自己的缤纷世界&#xff01; &#x1f3ae; 玩法介绍 鼠标滑动&#xff1a;在屏幕上随意滑动鼠标&#xff0c…

高原户外制氧机的优势特点有哪些

一、便携设计&#xff0c;突破环境限制 高原户外制氧机以轻量化、紧凑化设计为核心&#xff0c;重量普遍控制在3kg以内&#xff0c;可轻松装入背包或车载空间。采用折叠式吸氧管与一体化电源设计&#xff0c;支持太阳能充电板或车载供电&#xff0c;满足徒步、骑行、自驾等多元…

harmonyos实战关于静态图片存放以及image图片引入

编写demo轮播图的时候&#xff0c;用到图片&#xff0c;想到静态资源具体存放在哪里&#xff1f;&#xff1f; 官网工程目录结构解释&#xff1a;文档中心 Resource资源 使用资源格式可以跨包/跨模块引入图片&#xff0c;resources文件夹下的图片都可以通过$r资源接口读取到并…

LINUX530 rsync定时同步 环境配置

rsync定时代码同步 环境配置 关闭防火墙 selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/selinux/config SELINUXdisable设置主机名 hostnamectl set-hostname code hostnamectl set-hostname backup设置静态地址 cd /etc/sysconfi…