命令行参数环境变量
目录
前言:
命令行参数:
现象:
这些参数的意义:
为什么要这么做?
这些事是谁做的呢?
环境变量
现象:
创建环境变量:
结合程序理解:
前言:
我们在前一章就开始学习与进程相关的部分知识,上一章是先学习到了进程优先级接下来就是补充一些额外知识。
命令行参数:
现象:
我们是否还记得,我们在刚开始学习C语言的时候,对于main函数的写法我是介绍过的,我记得我说过main函数可以写成这样:int main(int argc, char* argv[]) 。我们当然是可以选择这样写也可以直接选择int main()这样直接完事。下面我们来看下列的代码:
输出结果:
当然我们还可以再尝试一下:
输入指令:./test -a -b -c -d
这些参数的意义:
我们在通过点斜杠运行可执行程序后,通过添加-a或者-b这样的参数即可看到argc和argv的变化,其实这些是和该进程匹配的选项,这些选项以这些空格作为分隔符,把他们放进一个指针数组里。 
其实作为区分的本质是将空格转换成'\0'加以区分的!
为什么要这么做?
可以通过输入不一样的选项,执行同一份代码的不同功能。以下通过代码举例子:

命令行参数本质是交给我们程序不同的选项,用来定制不同的程序功能。命令中会携带很多选项。
这些事是谁做的呢?
主要还是由我们的父进程bash(命令行解释器)管理,所以我们就可以得出以下结论:父进程的数据,默认能够被子进程看到并访问。命令行中启动的进程,都会变成进程,其实都是bash的子进程。
所以对我们之前通过点斜杠运行的可执行程序,默认是输入给父进程bash的。
因为子进程能看到父进程的数据,因此bash在识别几个-a -b -c后传递到argc,并再malloc出argv[],这些都是子进程能看到的。现在我们也能理解,为什么有些指令类似ls后面还会有一个-l或者-a这样的选项的意思了。
环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。相信大家如果配置过java或者嵌入式stm环境得物时候为这个环境变量抓狂过,接下来我们就来了解下环境变量!
现象:
在Linxu中,存在一些全局的设置,表明告诉bash(命令行解释器),应该在哪些路径下去寻找可执行程序。
我们可以尝试输入指令:echo $PATH
系统中有很多配置,在我们登录Linux系统的时候,就已经被加载到了bash进程中(在内存中的),默认查找到的环境变量是内存级的。
PATH其实环境变量的一种,而我们$PATH无非就是将环境变量的内容存放地打印出来,我们将结果打印出来的内容:PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ws/.local/bin:/home/ws/bin
这一串就是表示了各个环境变量存放的位置,比如/usr/local/bin这个文件夹,里面的可执行程序在该文件夹中,就代表了环境变量。其中 “:” 表示分隔符,bash在执行命令的时候,需要先找到命令,因为未来要加载。
刚刚我们讲命令行参数时,其实就有疑问了,运行test可执行程序时是要加点斜杠的,再加上-a -b之类的选项,然后我说这可以说明ls为什么有-l -a选项对应不同的功能。此时我们就会发现,ls这个指令就不用加点斜杠运行, 这又是为什么呢?
其实这个就是讲解环境变量最好的例子,这是因为bash会先去各个地址找,然后发现了ls在/usr/bin目录中
然后就会调用ls,所以在执行ls时就不用加点斜杠。
创建环境变量:
若是,我想要自己的可执行程序和系统指令一样,不带点斜杠该怎么办呢?目前我们介绍三种方法。
1、可以尝试使用cp命令,将自己的可执行程序拷贝到/usr/bin目录下。 
首先我需要给我的test可执行程序改名字,因为/usr/bin目录下有test这个环境变量。目前我们单独使用my_test是不起作用的,which也没有结果。所以我们开始进行拷贝。
演示成功啊,运行成功,和上面演示的一样。
2、也可以直接PATH =$PATH:"自己当前的目录",对于我的目录我就可以写成:
当然这种方式慎用,但是也没关系。因为我们每一次重启,环境变量右会重新归为。这是因为最开始的环境变量并不是在内存中的,而是在系统的对应配置文件中(默认在配置文件中)。
这个配置文件就在用户家目录下,.bash_profile文件、.bashrc文件和/etc/bashrc文件。其中前两个是用户的配置文件,最后一个是系统的配置文件。
所以如果我们想要永久更改环境变量的路径,可以直接在.bash_profile里更改。
见见更多的环境变量
可以输入:env 查看全部的环境变量。
这些环境变量都是极其准备好的。
export "环境变量名" = “环境变量内容” —— 添加
unset "环境变量" —— 取消
结合程序理解:
环境变量默认是可以被子进程拿到的!因为环境变量们,默认实是在bash里的。

而这些环境变量均是全局的!
环境变量有那么多,bash内部是如何组织的呢?
其本质是有一串代码组织的,extern char** environ;
接下来通过代码演示一下

不难发现,通过代码发现和我们直接输入env这个指令没有区别的。
bash再进程启动的时候,默认会给我子进程形成两张表:
argv[ ]命令行参数表(从用户输入命令行获取),env[ ]环境变量表(从OS的配置文件获取),bash通过各种方式交给子进程。

所以我们对于命令export XXX = XXX就是去env[ ]表里寻找NULL的地方,然后链入新的环境变量即可。
环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去
以下是获取环境变量的三种方法:
- char* path = getenv("PATH")
- 通过main函数参数char* env[ ]
- extern char** environ
在执行export添加新环境变量时不会创建子进程吗?![]()

子进程自己的数据bash看不到,但是export新的环境变量bash是可以看到的。当然执行export不会创建子进程,echo也不会创建子进程。这是因为export和echo是属于内建命令,这些命令是会有bash亲自执行。但是这只是一部分,因为80%的命令都是由bash创建子进程,子进程来执行的。
对于内建命令,可以理解为bash内部的一个个void类型的函数,执行完就执行完,并没有返回值。
注意!!!
如果你只是在输入指令:HELLO = 1234这样子输入,你本质只是创建了一个本地变量,而不是环境变量!你可以使用echo $HELLO打印出来
但是你无法通过env|grep HELLO查找出来,通过main函数或者extern char** environ这两种方法也查找不到!
本地变量只在ash内部有效,无法被子进程继承下去。只要导成环境变量,此时才能够被获取。
相关文章:
命令行参数环境变量
目录 前言: 命令行参数: 现象: 这些参数的意义: 为什么要这么做? 这些事是谁做的呢? 环境变量 现象: 创建环境变量: 结合程序理解: 前言: 我们在前…...
『大模型笔记』WizardLM:使大型预训练语言模型能够遵循复杂的指令
WizardLM: Empowering Large Pre-Trained Language Models to Follow Complex Instructions 文章目录 一. WizardLM:使大型预训练语言模型能够遵循复杂的指令二. Evolve-Instruct(优化版)2.1. 概述2.2. 实施二. 参考文献WizardLM:使大型预训练语言模型能够遵循复杂的指令:…...
编程-设计模式 2:抽象工厂模式
设计模式 2:抽象工厂模式 定义与目的 定义:抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。目的:该模式的主要目的是解耦客户端代码与产品类之间的关系,并确保一…...
阿里云智能大数据演进
本文根据7月24日飞天发布时刻产品发布会、7月5日DataFunCon2024北京站:大数据大模型.双核时代实录整理而成,演讲信息如下: 演讲人:徐晟 阿里云研究员/计算平台产品负责人 主要内容: Overview - 阿里云大数据 AI 产品…...
Java面试题———Spring篇①
目录 一,谈谈你对SpringIOC的理解 二,Spring中有哪些依赖注入方式 三,你用过哪些Spring注解 四,SpringBean的作用域有几种 五,Spring中的bean线程安全吗 六,谈谈你对SpringAOP的理解 七,…...
4章10节:用R做数据重塑,变体函数应用详解和可视化的数据预处理介绍
数据重塑(Data Reshaping)是将数据从一种结构转换为另一种结构的过程,是清理、分析和可视化数据的重要步骤。R语言作为数据科学的强大工具,提供了许多包来帮助我们进行数据重塑,其中最常用的就是dplyr包。dplyr包以其简洁的语法和高效的操作速度著称,它不仅可以帮助我们进…...
Socks5代理IP在跨境电商和网络爬虫领域的实战应用
在现代互联网环境中,Socks5代理IP因其强大的灵活性和隐私保护功能,成为了跨境电商和网络爬虫领域的重要工具。本文将探讨Socks5代理IP的基本原理,并详细介绍其在跨境电商和网络爬虫中的实际应用。 1. Socks5代理IP简介 Socks5代理IP是一种网…...
农业上的目标跟踪论文汇总
文章目录 2022Multi-object tracking using Deep SORT and modified CenterNet in cotton seedling counting (Computers and Electronics in Agriculture)A novel apple fruit detection and counting methodology based on deep learning and trunk tracking in modern orcha…...
gpxt 小程序:轨迹合并与管理的高效工具
引言 在户外探险和运动追踪领域,GPXT小程序以其独特的轨迹管理和合并功能脱颖而出,成为徒步、骑行等运动爱好者不可或缺的工具。本文将详细介绍GPXT小程序的核心功能及其对户外活动爱好者的实用性。 核心功能概览 轨迹合并 GPXT小程序允许用户将多个…...
elasticsearch集成springboot详细使用
1.es下载&配置 配置JVM 配置跨域 配置https和密码 2.es启动 .\elasticsearch.bat 或 后台启动: nohup ./bin/elasticsearch& 浏览器访问:https://localhost:9200 输入账户:elastic / 123456 3.重置es密码 .\elasticsearch-r…...
html+css网页制作 化妆品电商4个页面
htmlcss网页制作 化妆品电商4个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1ÿ…...
微调LLama 3.1——七月论文审稿GPT第5.5版:拿早期paper-review数据集微调LLama 3.1
前言 对于llama3,我们之前已经做了针对llama3 早7数据微调后的测评 去pk llama2的早7数据微调后,推理测试集中的早期paper:出来7方面review去pk gpt4推理测试集中的早期paper:7方面reviewground truth是早期paper的7方面人工rev…...
rust 编译时报错:type annotations needed for Box
如下图所示: 解决方法: 升级time的版本: cargo update -p time...
应用方案 | 低功耗接地故障控制器D4145
一、概述 D4145 是一个接地故障断路器。它能够检测到不良的接地条件,譬如装置接触到水时,它会在有害或致命的电击发生之前将电路断开。 D4145能检测并保护从火线到地线,从零线到地线的故障.这种简单而传统的电路设计能够确保其应用自如和长时间的可靠性。…...
第一次彩色pcb打样记录
感受和总结 看到彩色电路板和绿油板放在一起,感触还是挺大的。而且彩色板还直接给沉金,感觉焊上器件不要外壳都很好看了。后面一定记录一下这个板子实现的功能。 板子功能暂时分配 五个触摸盘,为了通过触摸控制不同功能,例如&a…...
通过 MediatR 实现了请求的分发和处理器的解耦
1. 前端请求发起 假设前端通过 HTTP GET 请求访问 GetTemplateSettings 端点,URL 中包含了 SubjectUuid 和 SubjectType 作为查询参数。 2. 进入 Controller 方法 请求到达后,会进入 MinBcController 类中的 GetTemplateSettings 方法,该方…...
Naive UI+vue一些组件的注意事项
NSpace(间距 Space) 默认给出space内的组件加一个div间隔,只能批量修改space内的元素样式,不能单独修改自组件样式,一般用于横向布局,若垂直布局若需要flex布局,慎用space组件NDataTable(数据表格 Data Table) :flex-h…...
sgetrf M N is 103040 时报错,这是个bug么 lapack and Openblas the same,修复备忘
号外: $ clang-format -style"{BasedOnStyle: llvm, IndentWidth: 4}" -i hello.cpp $ clang-format -style"{BasedOnStyle: llvm, IndentWidth: 4}" -i hello.cpp IndentWidth:4不错,默认2太下了 1,现象 MN103040时&…...
[后端代码审计] PHP 数组知识汇总
文章目录 前言1. 数组基础1.1 数组概念1.2 索引数组1.3 关联数组1.4 多维数组 2. 数组函数2.1 count()2.2 array_merge()2.3 array_keys()2.4 array_values()2.5 in_array() 3. 数组遍历3.1 for循环遍历3.2 foreach遍历3.3 遍历索引数组3.4 遍历关联数组 4. 数组排序4.1 sort()…...
单点Redis中面临哪些问题
我的后端学习大纲 我的Redis学习大纲 1.面试:请说下在单点Redis中面临哪些问题: 1.1.单点Redis的问题: 1.数据丢失问题:Redis是内存存储,服务重启可能会丢失数据 2.并发能力问题:单节点Redis并发能力虽然…...
别再让PostgreSQL连接数爆了!手把手教你用pgBouncer 1.24.1给数据库‘减负’(附日志自动清理脚本)
PostgreSQL连接池实战:用pgBouncer 1.24.1破解高并发瓶颈 当你的应用用户量突破十万级大关时,是否经常在凌晨被"too many connections"的告警惊醒?这就像高峰期的地铁站,每个乘客(客户端连接)都…...
iTVBoxFast二开版深度体验:从用户视角看会员系统、积分商城与多线路切换到底好不好用
iTVBoxFast二开版深度体验:会员系统、积分商城与多线路切换实战评测 1. 产品定位与核心功能解析 iTVBoxFast作为TVBox生态中的二次开发版本,在保留原有开源框架优势的基础上,针对商业化运营需求进行了深度定制。从终端用户视角来看࿰…...
告别VSCode!用Segger Embedded Studio玩转HPM6750 RISC-V开发(附详细激活与工程导入指南)
从VSCode迁移到Segger Embedded Studio:HPM6750 RISC-V开发实战指南 在嵌入式开发领域,工具链的选择往往直接影响开发效率和调试体验。对于HPM6750这类高性能RISC-V芯片的开发,许多工程师最初会尝试使用VSCode这类通用编辑器配合插件搭建环境…...
Vue3.0 简单商城—路由和index页面编写
上一个章节,简单编写了header组件:Vue3.0 简单商城—Header组件的编写 这篇文章简单介绍一下路由和index页面编写 1.index页面编写 我们创建一个index文件,代码参考下面 <template><div>这是index文件</div> </temp…...
面剂子机供应商生存破局:成本优化与市场拓展策略解析
面剂子机供应商生存破局FAQ:成本优化与市场拓展策略全解析"面剂子机供应商的生存破局,从来不是单一的成本削减,而是成本优化与市场拓展的双向奔赴"——这是行业内资深从业者的共识。当前面剂子机市场竞争日趋激烈,供应商…...
讯飞同传 双语字幕插件(浏览器端)
浏览器轻量插件,自动识别音视频,实时出中英双语字幕,无额外付费项,日常看视频、开会足够用。市面上字幕类工具不少,要么需要客户端,要么延迟高、翻译不准,这款直接跑在浏览器里,接入…...
别再被DLL报错劝退!VS2022配置SFML 2.6.0图形库的完整避坑指南
别再被DLL报错劝退!VS2022配置SFML 2.6.0图形库的完整避坑指南 如果你正在学习C游戏开发,SFML绝对是一个不可错过的图形库。它轻量、跨平台,而且API设计优雅,是初学者进入游戏编程世界的绝佳选择。然而,许多开发者——…...
Driver Store Explorer终极指南:5步彻底清理Windows驱动,释放10GB+系统空间
Driver Store Explorer终极指南:5步彻底清理Windows驱动,释放10GB系统空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间莫名减少…...
抖音无水印下载终极指南:douyin-downloader完整使用教程
抖音无水印下载终极指南:douyin-downloader完整使用教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback sup…...
观测ubuntu服务器调用taotoken api的延迟与token消耗情况
观测 Ubuntu 服务器调用 Taotoken API 的延迟与 Token 消耗情况 在将大模型能力集成到生产环境时,开发者不仅关注功能的实现,更关心服务的稳定性和成本的可控性。对于在 Ubuntu 服务器上部署的应用,通过 Taotoken 平台统一接入多家模型后&am…...
