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

 🪐🪐🪐欢迎来到程序员餐厅💫💫💫

          主厨:邪王真眼

主厨的主页:Chef‘s blog  

所属专栏:青果大战linux

总有光环在陨落,总有新星在闪烁


前几天在搞硬件,所以拖更了,现在基本完成,于是立刻投入了Linux的怀抱

main的参数

我们c语言学习的第一段代码那一定是hello,world,之后我们在此基础之上,不断地学习着。

 include<stdio.h>  int main(){  printf("hello,world\n");                                                                                                                                                                                                    } 

想必大家都知道main本质也是一个函数,他也像上面那样显示的一样,是个没有形参的函数。

、、、还是说,并不是这样!

某些小伙伴可能见过main下面这种用法

 #include<stdio.h>int main(int argc ,char* argv[]){printf("%d",argc);for(int i=0;i<argc;i++)printf("%s\n",argv[i]);                                                                                                                                                                                                 }

这里出现了两个参数,一个int整型,一个指针数组,而他们就是我们在linux中能够使用命令的关键。

我们对代码进行加工,

#include<stdio.h>
#include<string.h>
int main(int argc ,char* argv[]){printf("argc:%d\n",argc);if(argc!=2){printf("格式错误\n");}else {if(strcmp(argv[1],"-a")==0)printf("功能a\n");else if(strcmp(argv[1],"-b")==0)printf("功能b\n");else  if(strcmp(argv[1],"-c")==0)printf("功能c\n");else{printf("其他功能\n");}}
}

我知道,你很急,但你先别急,马上解惑

在我们像以往一样直接./test1.exe运行文件,输出如下

argc的值是1.并告诉我们格式错误。接着我们像指令一样,加入“-a”“-b”,“-c”选项,输出如下

 这时敏锐的朋友就已经意识到了,我们在命令行所使用的命令及其对应的选项,就是用的main函数带参数的方法!

我们在命令行输入一条语句,他会被按照空格进行分割,像上面的“./test1.c -a”,就会被分成两个参数,argc所存储的就是参数的个数,所有参数都会被以字符串的形式从左到右依次放到argc数组中,该数组最后一个元素是NULL,所以也可以这么写

#include<stdio.h>
int main(int argc,char*argv[]){
printf("argc:%d\n",argc);
int i=0;
while(argv[i])
{printf("%s\n",argv[i++]);
}}

在此基础之上,我们不禁好奇,分割这个字符串的是谁呢,显然他不是该可执行程序,因为这段代码从main函数才开始运行,但是分割字符串是发生在调用main之前的(不然没法传参)

要知道我们在命令行所启动的程序,不论是指令也好,是自己写的代码也罢,他们的父进程是唯一且确定的,即shell,他们互为父子进程,因此我们不难推测就是bash分割了字符串,接着以main函数传参的方式把数据传给了我们的test3.exe,至于具体怎么操作的,我们以后再说

我叮嘱一下,这个main函数的参数不是说一定要写为argc和argv,只是我们普遍这样写,你要是非要写成int a和char*b[]也是没问题的。


环境变量

事实上,main函数有三个参数,第三个就是环境变量,我们来展示一下

#include<stdio.h>
int main(int argc,char*argv[],char*env[]){
int i=0;
while(env[i])
{printf("%s\n",env[i++]);
}
}

我们一运行文件,就打印出一大堆字符串,他们就是环境变量。

环境变量的概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

我们来讲解几个常见的环境变量 

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell的路径,它的值通常是/bin/bash。
  • USER:当前正在使用系统的用户是谁
  • HOME:当前用户的家目录在哪
  • PWD:当前路径

关于PATH

        我们在使用指令时直接输入指令名称和选项即可,但是在运行自己写的可执行文件时,需要在他前面加上相对路径或者绝对路径。这就是PATH的作用,PATH是多个路径拼接而成的字符串由“:”作为分隔符,在运行可执行文件时,如果没有带路径,会先在PATH中查找,看该文件是否在这些路径中,如果有就可以运行,如果没有则相当于找不到该可执行文件,就无法执行。而指令的绝对路径包含在PATH中,因此可以不待路径直接运行。 


查看环境变量

  • echo$+名称

  •  getenv查看环境变量

输入一个环境变量名,他会返回该环境变量的值,包含在stdlib.h中

注意不可以查看本地变量

#include<stdio.h>
#include<stdlib.h>
int main(){printf("%s\n",getenv("PATH"));printf("%s\n",getenv("a"));}

  •  指针数组

enviorn,是一个外部变量,这是c语言提供的,我们直接加extern声明即可

#include<stdio.h>
#include<unistd.h>
extern char**environ;
int main(){
int i=0;while(environ[i])printf("%s\n",environ[i++]);
}

  • env指令 

显示所有环境变量

  • set指令

显示所有环境变量和本地变量


 修改环境变量

PATH=xxx即可

不过此时我们会发现指令无法使用了,这是因为之前的那些路径被现在的覆盖了如果是想在原路径的基础上进行添加只需要先退出xshell(恢复到原本的PATH)再PATH=$PATH:xxx即可

 我们修改了PATH这个环境变量,但是一关闭xshell,再开启,PATH的值就恢复成原来的样子了,我们对他的修改没有在关闭后保存。于是我们可以推测这些环境变量是存在于内存中的。就像我们c语言可以malloc一样,程序在启动时开辟一段内存空间,从父进程继承环境变量。父进程的环境变量则是由父进程的父进程传递来的。其最终源头,是一份系统配置文件,存储在硬盘中,掉电不丢失,当我们登录账号时,会启动shell进程,他会从该文件中读取相关信息并开辟空间进行存储,组成自己的环境变量表,而shell是所有进程的父进程,因此别的进程就可以从他这里继承环境变量了。在用户目录下,有两个隐藏文件。就是我们说的系统配置文件。


设置与取消环境变量

a=100

我们用echo查一下

本质是你的shell会把这个字符串记录下来,并为他开辟一片空间,于是echo查询的时候就会查到他,这种变量叫做本地变量,这种变量无法被子进程继承

想要把本地变量转化为环境变量,只需要export+本地变量名,就可以了

也可以在定义时写为

export a=10

取消环境变量和本地变量unset 变量名


-------------很好,关于环境变量就算是讲完了,觉得有用的话,还请关注一下作者吧。-------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1864.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构与算法】第7课—数据结构之队列

文章目录 1. 队列1.1 什么是队列1.2 队列的结构1.3 队列初始化1.4 队列入栈1.5 出队列1.6 查找队列有效元素个数1.7 取队头和队尾数据1.8 销毁链表 2. 用两个队列实现栈3. 用两个栈实现队列4. 循环队列 1. 队列 注&#xff1a;文中Queue是队列&#xff0c;Quene是错误写法 1.1 …

数据结构 ——— 向上/向下调整算法将数组调整为升/降序

目录 向上调整算法&#xff08;默认小堆&#xff09; 向下调整算法&#xff08;默认小堆&#xff09; 利用向上调整算法对现有数组直接建堆 利用向下调整算法对以建成的小堆数组排降序 举一反三&#xff1a; 那么如何将数组 a 排成升序呢&#xff1f; 向上调整算法&…

一种基于GPU的归并排序并行实现

0️⃣归并排序流程 分割过程&#xff1a;将待排序数组等分为左右子数组&#xff0c;再对左右子数组递归式等分&#xff0c;直至不可分割合并过程&#xff1a;将所有子数组两两递归合并&#xff0c;逐步得到较大有序数组&#xff0c;直到得到完整有序数组 1️⃣传统的并行归并 …

【MySQL】数据类型

目录 一、常见数据类型汇总 二、数值类型 2.1 tinyint 2.2 bit 2.3 float 2.4 decimal 三、字符串类型 3.1 char 3.2 varchar 四、日期和时间类型 五、枚举和集合 5.1 enum枚举 5.2 set集合 一、常见数据类型汇总 分类数据类型说明数值类型BIT(M)二进制位。M指定…

《探索 HarmonyOS NEXT (5.0):开启构建模块化项目架构奇幻之旅 —— 动态路由 ZRouter:引领高效模块通信的智慧中枢》

ZRouter简介&#xff1a;是一款轻量级的动态路由框架&#xff0c;基于Navigation系统路由表和Hvigor插件实现的方案&#xff0c;可以解决多个业务模块&#xff08;HAR/HSP&#xff09;之间解耦和通信问题&#xff0c;从而实现业务复用和功能扩展。 ZRouter出处ZRouter&#xff…

网络原理(数据链路层)->以太网帧格式解

前言 大家好我是小帅&#xff0c;今天我们来了解以太网帧格式 个人主页 文章目录 1.数据链路层1.1 认识以太⽹1.2 MAC地址&#xff08;⽹卡的硬件地址&#xff09;1.2.1 对⽐理解MAC地址和IP地址 1.3 认识MTU1.4 MTU对IP协议的影响1. 5 MTU对UDP协议的影响1.6 MTU对于TCP协议的…

银行金融知识竞赛活动策划方案

根据《中国人民银行**市中心支行“创新金融服务&#xff0c;支持经济发展”业务竟赛活动实施方案》安排&#xff0c;中支决定于9月28日举办**市人民银行系统“创新金融服务&#xff0c;支持经济发展”现场业务竞赛&#xff0c;为确保业务竞赛组织工作顺利开展&#xff0c;特制定…

渗透测试练习题解析 7 (CTF web)

一、[红明谷CTF 2021]write_shell 1 考点&#xff1a; 1、PHP 短标签 2、 符号的使用 通过代码可知 check 是一个过滤函数&#xff0c;利用正则的方式过滤掉 空格、php、eval 等一些关键字或符号&#xff0c;$dir 是路径&#xff0c;这个值可以通过 actionpwd 获取到&#…

VBA中类的解读及应用第十七讲:类,让文本框在激活时改变颜色(下)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

如何下载安装TestLink?

一、下载TestLink、XAMPP TestLink 下载 |SourceForge.net 备用&#xff1a;GitHub - TestLinkOpenSourceTRMS/testlink-code&#xff1a; TestLink开源测试和需求管理系统 下载XAMPP&#xff1a; Download XAMPP 注意&#xff1a;TestLink与PHP版本有关系&#xff0c;所以XA…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

实现旺店通到金蝶云星空的数据集成:技术详解

旺店通旗舰版数据集成到金蝶云星空案例分享&#xff1a;入库瞬时成本-生产入库单-1 在企业日常运营中&#xff0c;数据的高效流转和准确对接是确保业务顺利进行的关键。本文将聚焦于一个具体的系统对接集成案例——如何将旺店通旗舰版的数据集成到金蝶云星空&#xff0c;以实现…

selinux与防火墙

一.selinux (1).什么是selinux SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linu。 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序&#xff0c;因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 (2)…

【论文精读】LPT: Long-tailed prompt tuning for image classification

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

链表详解(三)

目录 链表功能实现链表的查找SLNode* SLFind(SLNode* phead, SLNDataType x)代码 链表任意位置前插入void SLInsert(SLNode**pphead&#xff0c;SLNode* pos, SLNDataType x)代码 链表任意位置前删除void SLErase(SLNode**pphead&#xff0c;SLNode* pos)代码 链表任意位置后插…

有php转go项目经验者优先?

新的一周又来了&#xff0c;今天分享的是上海某公司的一面面经&#xff0c;内容主要就是go、mysql和项目&#xff0c;职位要求如下&#xff1a; 发现一个很有意思的点—有php转go项目经验者优先。想不到还有这种好事&#xff0c;本人就是php转go&#xff0c;跟我有相同经历的朋…

【AI换脸整合包及教程】AI 换脸新潮流:FaceFusion 3.0.0,开启无限创意之旅

在科技飞速发展的今天&#xff0c;人工智能已经深入到我们生活的各个角落。其中&#xff0c;AI 换脸技术以其惊人的创造力和趣味性&#xff0c;吸引了无数人的目光。而在众多 AI 换脸工具中&#xff0c;FaceFusion 3.0.0 脱颖而出&#xff0c;成为了引领潮流的佼佼者。 一、AI …

【智慧中控项目】

智慧中控 前言一、搭建开发环境1.需要做什么&#xff1f;1.1 刷机和启动OrangePi Zero2&#xff08;全志H616芯片&#xff09;1.2 在PC上安装虚拟机VM&#xff08;安装VirtualBox或VMware&#xff1a;这是常用的虚拟机软件工具&#xff09;1.3 在虚拟机VM&#xff08;VirtualBo…

“短线看涨”,上升周期中,抓以小波段行情,落袋为安

使用技巧 短线看涨指标属于副图公式&#xff0c;短线怎么操作&#xff1f;看蓝色短期安全线 这个公式主要是在上升周期中&#xff0c;抓以小波段行情为主&#xff0c;落袋为安 弱水三千 只取一瓢 公式 DIFM:(EMA(C,240)-EMA(C,520)); DEAM:EMA(DIFM,180); MACD&#xff08…

21_双端 diff 算法

目录 双端比较的原理非理想状况的处理方式添加新元素移除不存在的元素 在上一节中&#xff0c;我们实现了简单的 diff 算法&#xff0c;简单的 diff 算法利用 key 属性&#xff0c;尽可能的复用 DOM 元素&#xff0c;并通过移动 DOM 元素来完成更新&#xff0c;从而减少不断创建…