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

命令行参数和环境变量

一、基本概念命令行参数是程序运行时通过命令行终端 / 控制台传入程序的额外参数用于在不修改代码的情况下动态配置程序行为比如指定输入输出文件、设置运行模式等。C 语言中main 函数支持两个参数来接收命令行参数是最经典的实现argcargument count参数个数包含程序名本身所以最小为 1argvargument vector参数数组字符串指针数组每个元素是一个命令行参数argv[0]程序本身的路径 / 名称比如 ./a.out 或 test.exeargv[1]~argv[argc-1]用户传入的实际参数argv[argc]固定为 NULL作为数组结束标志。程序运行结果如下当输入./code1时会输出当输入./code1 -a -b -c -d时会输出这就和我们在使用ls命令时通常会使用该命令的参数 -a -l -r -t来实现不同的子功能类似命令行参数的本质应用是为了实现一个命令可以根据不同的选项实现不同的子功能。这也是Linux中所有命令选项功能的实现方式。环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数如我们在编写 C/C 代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性Linux下存在一个系统级的全局的环境变量PATH我们可以使用用echo命令$PATH查看该环境变量的内容该环境变量的作用Linux告诉系统如果用户执行一个可执行文件没有指明路径系统就会默认在PATH环境变量的路径下查找。PATH环境变量本质是协助Linux进行指令查找的一个环境变量。那我们是否能把我们自己所写的可执行文件添加到PATH环境变量的路径里呢答案是肯定的。我们只需要使用PATH$PATH:当前路径就可以把我们当前的路径添加到环境变量中这样我们就能直接执行我们生成的可执行文件。如下图所示要注意的是不能直接让PATH当前路径这样只会把原来的默认路径给覆盖掉导致系统的很多自带的命令无法使用。如下图所示前面所写的可执行文件code1可以直接执行但是系统自带的ls却无法执行了因为原来的路径被我们设置的路径覆盖了系统无法再在原来的路径下找到ls命令二、常用环境变量如何查看当前用户下相关的所有的环境变量呢使用env命令就可以查看所有相关的环境变量如图以下是常用的环境变量PATH指定命令的搜索路径HOME指定用户的主工作目录 (即用户登陆到 Linux 系统时默认的目录)SHELL当前 Shell, 它的值通常是 /bin/bash。三、环境变量和c/c代码\进程之间的关系3.1用代码获取环境变量从前面的命令行参数部分我们可以知道main函数是有参数的我们还可以在后面再添加上char* env[]如下int main(int argc,char *argv[],char* env[])char* env[]是环境变量表这个操作本质上是把环境变量表传递给进程环境变量的组织方式如下图可以通过三种方式获取环境变量1.当知道argc、argv[]和env[]三个参数时环境变量2.char ** environ使用getenv时需要包含头文件unistd.h环境变量同上3.getenv环境变量名使用getenv时需要包含头文件stdlib.h编译后不同的环境变量具有不同的使用场景环境变量是父进程给子进程的。bash有两张表——命令行参数和环境变量表。子进程和父进程的数据是共享的只是在后面部分使用fork()分流因此父进程的全局变量子进程也可以识别得到。所以bash创建子进程后子进程可以接收到bash的命令行参数和环境变量表子进程再创建子进程子进程的子进程也可以识别到这两张表。所有环境变量发起的位置是从bash开始的。而bash进程的环境变量是从Linux系统的配置文件中来的程序启动前bash会读取配置文件的内容将环境变量加载到进程的上下文。这也就能解释为什么修改了环境变量后关闭xshell后重新打开环境变量会重新刷新。3.2设置环境变量在设置环境变量之前首先需要提到一个概念叫本地变量。本地变量和环境变量的区别就在于本地变量不能被子进程继承不具备全局性只能在bash内部访问。在这里先提前声明两种变量的区别下文会做解释。设置环境变量首先需要设置一个本地变量。我们可以直接在命令行中输入想要设置的本地变量的名字内容例如TEST_ENV123456789。设置成功后会发现在输入env |grep TEST_ENV时找不到这个环境变量。但是输入echo $TEST_ENV却可以查看环境变量的内容。此时需要使用export TEST_ENV将该本地变量导出到环境变量表中这样才能被bash找到。这也就说明了环境变量和本地变量的区别本地变量只能在bash内部访问而不能在全局下访问。由于本地变量缺少全局性也就使得它不能被子进程所继承。如果想要全局下访问就得使用export命令。而export命令本质上就是把我们所设置的环境变量导入到环境变量表中将本地变量转化为环境变量使得环境变量能被bash识别到。当我们使用export命令将环境变量导入到bash的环境变量表后我们就可以通过代码的方式使用getenvname来获得我们创建的环境变量。当使用getenv获取不存在的环境变量时返回的是NULL。如下图当我们设置了环境变量时当不想要时应该怎么删除呢我们可以使用unset环境命令名 来取消环境变量如下3.3环境变量的相关操作总结1.echo: 显示某个环境变量值2.export: 设置一个新的环境变量3.env: 显示所有环境变量4.unset: 清除环境变量5.set: 显示本地定义的 shell 变量和环境变量上述与环境变量有关的操作都是内存级的不会影响到配置文件。如果要影响到配置文件需要使用vim打开并修改配置文件.bash_profile里面的内容然后当我们关闭xshell后重新登录对应用户bash就会重新读取配置文件包括我们创建的环境变量然后输入env命令就可以查看到我们之前创建的的环境变量了。
http://www.zskr.cn/news/1393746.html

相关文章:

  • U-Net图像分割终极指南:5步构建医学细胞膜识别模型 [特殊字符]
  • m4s-converter终极指南:3分钟学会B站缓存视频转换
  • acbDecrypter:游戏音频解密神器 - 轻松提取加密音频文件的最佳解决方案
  • 传统家务追求一次性做完,编写碎片化家务分配程序,拆分家务分散完成,拒绝集中疲劳做家务。
  • 现代智能汽车中的无线技术41——BT与BLE(0)
  • 插件安装成功率提升300%的关键:ChatGPT官方插件市场未标注的Manifest V3签名规则与Content-Security-Policy绕行方案
  • Zotero PDF2zh技术解析:5步构建智能学术文献翻译工作流
  • 三分钟学会用curl命令测试Taotoken大模型API连通性
  • 【2024企业级ChatGPT数据分析白皮书】:基于217家客户实测验证的12个高危误用陷阱与规避方案
  • G-Helper终极指南:3分钟让华硕笔记本性能翻倍,告别Armoury Crate卡顿!
  • 别浪费钱了!2026亲测好用的AI论文写作软件|实测避坑硬核版
  • Bottles:重新定义Linux上的Windows应用生态兼容性
  • HIMA Z1001视觉连接模块
  • ComfyUI-Impact-Pack技术架构解析:模块化图像增强系统的5大核心设计原理
  • ChatGPT降重黑箱破解:基于BERT-SCORE与ROUGE-L双指标验证的语义保留率TOP3策略(稀缺实验数据包)
  • Node-RED Dashboard终极指南:5步构建专业物联网仪表板
  • 咨询顾问效率提升300%的关键,Lovable工具底层逻辑与可复用代码模板全公开
  • 3步完成Windows 11终极优化:Win11Debloat完整使用指南
  • AG-CLIP:基于属性引导的细粒度零样本视觉识别技术详解
  • Cadence Allegro 16.6 Gerber文件实战:从设计到交付板厂的完整流程
  • 腾讯云代理商:腾讯云云桌面如何部署Hermes Agent?
  • 戴森球计划工厂蓝图终极指南:从新手到专家的四步构建法
  • 大理石方箱批发厂家资质与交付能力客观解析 - 奔跑123
  • TikTok等中国企业掘金拉美电商,“慢市场”开荒者熬过磨合期收获红利!
  • 戴森球计划工厂蓝图完全解析:从零构建星际工业帝国的五大核心策略
  • AI热潮后PC组件价格将改善!阵亡将士纪念日,SSD等存储产品大折扣来袭
  • 终极游戏串流指南:Moonlight安卓端阿西西修改版如何实现40%延迟降低
  • 游戏素材提取终极指南:开源资源库如何解决二次元素材获取难题
  • 地图API费用5万?这些低成本替代方案让你轻松实现逆地址编码功能
  • 【AIGC内容创作黄金标准】:基于217篇获奖文案数据验证的ChatGPT创意输出评估矩阵