操作系统:环境变量

目录

1.命令行参数

1.1.概念引入

 1.2.命令行参数概念

2.环境变量

2.1.概念引入

2.2.环境变量概念

2.2.1常见的环境变量

2.3. 如何获取环境变量

2.3.1.Linux操作系统

2.3.2.代码获取

2.3.3.系统调用

2.4.环境变量的来源

2.5.环境变量的全局性


1.命令行参数

1.1.概念引入

注意当部分代码均在Linux下运行!

再讲环境变量前我们先引入一个概念:命令行参数,那什么是命令行参数呢?我们知道main()函数其实是可以带参数的,再给出定义之前下面我们用一段代码来体会一下什么是命令行参数。

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

如图:在Linux操作系统中我们跑这一段程序,发现结果分别打印了,程序名 + 我们写的一段话的每一部分(这里有以空格为分隔符,分割几份子串),数一数恰好从0-8一共有9份,我们再看回这一段代码,我们可以猜到argc = 9,也就是九个字符串,并且对应着这个指针数组,那么我们可以抽象出来

还是不理解的话,我们可以做一个小demo,命令行版本的计算器。

我们的输入规则为:

程序名  -add num1 num2

程序名 -sub num1 num2                 (其中num1,num2计算的数据)

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{if (argc == 4){int num1 = atoi(argv[2]);int num2 = atoi(argv[3]);if (strcmp(argv[1], "-add") == 0){printf("%d + %d = %d\n", num1, num2, num1 + num2);}else if (strcmp(argv[1], "-sub") == 0){printf("%d - %d = %d\n", num1, num2,  num1 - num2);}else {printf("option illegal\n");printf("the right input is: process option(-add, -sub) num1 num2\n");}}else{printf("input illegal\n");printf("the right input is: process option(-add, -sub) num1 num2\n");}return 0;
}

 1.2.命令行参数概念

命令行参数是在命令行界面中输入的一些额外信息,用于向程序传递参数或配置选项。通过命令行参数,我们可以在运行程序时指定不同的参数值,从而改变程序的行为。

命令行参数通常以空格分隔,并且以特定的格式传递给程序。在大多数操作系统中,命令行参数的格式通常是以"-“或”–"开头的选项,后面跟着选项的值。例如,在Linux系统中,可以使用以下格式传递命令行参数:

program_name -option1 value1 -option2 value2

在程序中,可以使用命令行参数来控制程序的执行逻辑、配置文件路径、调试模式等。通过解析命令行参数,程序可以根据用户的需求进行相应的操作。

再联系一下我们在Linux中学到的指令,比如最简单的 ls -a,ls -l这一些那我们就知道了命令行参数的作用了,便于一个大的模块转入一些不同的小模块。

2.环境变量

2.1.概念引入

在操作系统中“执行一条命令,需要找到可执行程序的位置”,我们在Linux操作系统中,运行一个自己写的可执行程序,一般都是通过“./程序名”来运行,而不能直接“程序名”来使用呢?。但是Linux的指令本质上也是一些可执行程序,那为什么他们可以直接ls、pwd、which直接使用呢?

根本原因就在于:Linux操作系统有一个叫做环境变量的东西,环境变量里添加着Linux内支持的指令,而我们自己写的可执行程序并不在环境变量里,也就是操作系统无法通过程序名来找到这个可执行程序。那么我们也可以通过把自己写的可执行程序写入环境变量中来实现程序名启动。

2.2.环境变量概念

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

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

2.2.1常见的环境变量

PATH : 指定命令的搜索路径

HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

SHELL : 当前Shell,它的值通常是/bin/bash。 

2.3. 如何获取环境变量

2.3.1.Linux操作系统

通过输入 “echo $环境变量名 ” 指令查看

Linux下环境变量相关指令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

2.3.2.代码获取

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

这段代码跟在Linux下运行跟输入env指令一致,都是打印全部的环境变量,这里的env[]指针数组本质上就是一个环境变量表 

而实际上系统在启动我们的程序时,可以选择给我们的进程(main)提供“命令行参数表”、“环境变量表”

// 这一段代码也可以获取环境变量
#include <stdio.h>int main(int argc, char* argv[])
{extern char** environ;int i = 0;for (; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

environ为指向环境变量表的指针 

2.3.3.系统调用

通过系统提供的getenv()接口来获取

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{// 判断为root用户的demo,可以作为权限控制的小模块// getenv() 内填 环境变量名char* who = getenv("USER");if(strcmp(who, "root") != 0){printf("%s,是非法用户\n", who);return 1;}printf("当前为%s用户", who);return 0; 
}

2.4.环境变量的来源

在操作系统中,子进程的命令行参数和环境变量是通过父进程的bash传递的。那么父进程的环境变量信息又是从哪里来的?并且我们在实际操作中,修改Shell中的环境变量,重启后,又恢复成原来的样子,这又是为什么呢?

答:首先环境变量里在系统中以“脚本配置文件”的形式存储,当我们启动时会重新生成对应的环境变量信息,也就是就算修改了bash的环境变量,也只是修改了加载在内存时的环境变量表,并不影响磁盘中存储的“脚本配置文件。

2.5.环境变量的全局性

我们在2.4中提到子进程的环境变量是通过父进程的bash传递的,也就是说环境变量可以被子进程继承下去,环境变量信息具有全局性。我们先来引入两个概念

  1. 本地变量(Local Variable): 本地变量是在程序中定义的、仅在特定作用域内可见和使用的变量。它们通常在函数或代码块内部声明,并且只能在声明它们的作用域内访问。本地变量的生命周期仅限于其所在的作用域,一旦超出作用域范围,本地变量将被销毁。本地变量的作用是存储临时数据,供当前作用域内的代码使用。

  2. 环境变量(Environment Variable): 环境变量是在操作系统中定义的、全局可见的变量。它们存储了一些系统级别的配置信息,如路径、用户名、操作系统版本等。环境变量可以在整个操作系统中被访问和使用,不同的程序可以通过读取环境变量来获取系统配置信息。环境变量通常由操作系统或用户自定义,并且可以在运行时进行修改。

在Linux中,我们可以通过以下指令实现,本地变量的创建,这里我们设定了本地变量MYENV

再通过这段代码尝试打印这个本地变量,发现这个本地变量无法被打印 

#include <stdio.h>
#include <stdlib.h>int main()
{// 获取环境变量char* env = getenv("MYENV");if (env) {// 如果成功获取 那么打印printf("%s\n", env);}else{printf("can not find MYENV\n");}return 0;
}

最终我们把本地变量导入环境变量中就可以输出这个MYENV,也就是本地变量只对当前bash有效(因为本地变量我们是通过命令行指令创建的,并未加载到全局),那么所以我们就能推出“环境变量具有全局性”

但是我们又发现为什么echo这个指令可以打印出MYENV对应的值10000呢?

这里涉及Linux的指令分类为“内建命令”和“常规命令

也就是我们如果想要在常规命令下访问我们的本地变量,就需要将本地变量通过export命令升级为环境变量,让bash的所有子进程继承下去。而对于内建命令如echo、pwd、export......是不受环境变量影响的指令,我们也可以实验一下将环境变量置为空,ls、which、who等命令无法使用但是内建命令任然可以使用。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp开发的跳转到小程序

uniapp开发的h5跳转到小程序 https://www.cnblogs.com/xiaojianwei/p/16352698.html uniapp拉起小程序 在uniapp中拉起小程序&#xff0c;可以使用官方提供的API uni.navigateToMiniProgram。以下是一个简单的示例代码&#xff1a; uni.navigateToMiniProgram({appId: 目标…

unity学习(54)——选择角色界面--解析赋值服务器返回的信息1

1.decode这种照猫画虎的工作 把逆向出来UserHandler.cs中的内容&#xff0c;融到自建客户端的MessageManager.cs中&#xff1a; 2.此时登录账号&#xff0c;马上显示当前账号下已有三名角色&#xff1a; 此时返回数据包中的command的值是1&#xff1a; 3.当注册玩家数超过三名…

【大厂AI课学习笔记NO.78】智能芯片产业人才能力图谱

有志于从事智能芯片产业的朋友&#xff0c;可以参考下上面的图谱。 比如C站的程序猿很多&#xff0c;那么技能能力中&#xff0c;你要掌握的就包括C/C、Python、Bash等常用的编程语言。 还要熟悉TensorFlow、PyTorch等主流的深度学习框架。 这两个框架&#xff0c;我们都介绍…

一 超级数据查看器 讲解稿 系统介绍

一 超级数据查看器 讲解稿 系统介绍 APP下载地址 百度手机助手 下载地址4 点此此处 以新页面方式 打开B站 教学视频 讲解稿 大家好&#xff0c;这里我给大家介绍一下超级数据查看器&#xff0c; 超级数据查看器。就是桌面这个蓝色的房子图形的APP。 超级数据查看器是一个提供数…

HTML 学习笔记 总结

总结 【标签按照功能进行分类】&#xff1a; <!DOCTYPE html>&#xff1a;声明为 HTML5 文档 <html>&#xff08;双标记、块标记&#xff09;&#xff1a;是 HTML 页面的根元素&#xff0c;定义 HTML 文档 <head>&#xff08;双标记、块标记&#xff09;&a…

算法-双指针、BFS与图论-1224. 交换瓶子

题目 思路 可以交换任意两个瓶子&#xff0c;最多n-1次&#xff1b;如果是只能交换相邻的瓶子&#xff0c;那么相当于逆序对的个数&#xff08;这篇博客是介绍如何计算逆序对的算法&#xff1a;算法篇&#xff1a;逆序对_逆序对算法-CSDN博客&#xff09;本题转换为图论去看:边…

【数据结构与算法】绪论

目录 一、数据结构研究 二、基本概念和术语 2.1 基本概念 2.2 什么是数据结构&#xff1f; 2.3 数据结构内容 2.4 逻辑结构种类 2.5 存储结构种类 2.6 数据类型和抽象数据类型 三、算法和算法分析 3.1 算法的定义 3.2 算法的特性 3.3 算法设计要求 3.4 算法好坏评…

JAVA虚拟机实战篇之GC调优[1](GC调优基知、方法、工具和常见GC模式)

文章目录 版权声明GC调优概念GC调优核心指标(KPI)吞吐量延迟&#xff08;Latency&#xff09;内存使用量 GC调优方法GC调优步骤GC调优工具jstat工具visualvm插件Prometheus Grafana GC日志分析GC日志保存GC日志分析工具GC ViewerGCeasy 常见的GC模式正常情况缓存对象过多情况内…

01_electron入门

由于毕业论文可能需要用 electron&#xff0c;所以 Linux 驱动学习慢了下来。 一、安装 node.js 进入 node.js 官网&#xff1a;Node.js (nodejs.org) 咱们就是用稳定版&#xff0c;安装包除了安装路径自己选择外&#xff0c;一直点 Next。 安装完成后需要配置环境&#xff0c…

如有Kata

养成跑步的习惯&#xff0c;就能习惯性跑步&#xff0c;一有空就见缝插针抽空跑步。这是一层韵律感、完成感、美感、成就感。而一次跑步的一连串动作&#xff0c;是另一层韵律感、完成感、美感、成就感。所以这里就有了两层的韵律感、完成感、美感、成就感。如是如水漂荡漾。健…

动手做一个最小RAG——TinyRAG

Datawhale干货 作者&#xff1a;宋志学&#xff0c;Datawhale成员 大家好&#xff0c;我是不要葱姜蒜。 接下来我会带领大家一步一步地实现一个简单的RAG模型&#xff0c;这个模型是基于RAG的一个简化版本&#xff0c;我们称之为Tiny-RAG。Tiny-RAG是一个基于RAG的简化版本&am…

SpringBoot源码

SpringBoot核心前置内容 1.Spring注解编程的发展过程 1.1 Spring 1.x 2004年3月24日&#xff0c;Spring1.0 正式发布&#xff0c;提供了IoC&#xff0c;AOP及XML配置的方式。 在Spring1.x版本中提供的是纯XML配置的方式&#xff0c;也就是在该版本中必须要提供xml的配置文件…

八、词嵌入语言模型(Word Embedding)

词嵌入&#xff08;Word Embedding, WE&#xff09;&#xff0c;任务是把不可计算、非结构化的词转换为可以计算、结构化的向量&#xff0c;从而便于进行数学处理。 一个更官方一点的定义是&#xff1a;词嵌入是是指把一个维数为所有词的数量的高维空间&#xff08;one-hot形式…

小迪安全36WEB 攻防-通用漏洞XSS 跨站MXSSUXSSFlashXSSPDFXSS

#XSS跨站系列内容:1. XSS跨站-原理&分类&手法 XSS跨站-探针&利用&审计XSS跨站另类攻击手法利用 XSS跨站-防御修复&绕过策略 #知识点&#xff1a; 1、XSS 跨站-原理&攻击&分类等 2、XSS 跨站-MXSS&UXSS&FlashXss&PDFXSS 等 1、原…

HCS-华为云Stack-计算节点内部网络结构

HCS-华为云Stack-计算节点内部网络结构 图中表示的仅为计算节点是两网口的模式&#xff0c;如果是四网口模式&#xff0c;系统会再自动创建一个网桥出来 图中未画出存储平面和Internal Base平面&#xff0c;它们和tunnel bearing、External OM-样&#xff0c;都是通过trunk0的…

信息系统项目管理师006:车联网(1信息化发展—1.2现代化基础设施—1.2.3车联网)

文章目录 1.2.3 车联网1.体系框架2.链接方式3.场景应用 记忆要点总结 1.2.3 车联网 车联网是新一代网络通信技术与汽车、电子、道路交通运输等领域深度融合的新兴产业形态。智能网联汽车是搭载先进的车载传感器、控制器、执行器等装置&#xff0c;并融合现代通信与网络技术&…

Linux常用命令之top监测

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用 for let arr [2, 4, 6, 56, 7, 88];//for for (let i 0; i < arr.length; i) {console.log(i : arr[i]) //0:2 1:4 2:6 3:56 4:7 5:88 }普通的for循环可以用数组的索引来访问或者修改…

SAP BTP Hyperscaler PostgreSQL都有哪些Performance监控 (一)

前言 SAP BTP云平台中&#xff0c;除了自身的HANA数据库作为首选以外&#xff0c;它还支持PostgreSQL的整套服务&#xff0c;并以PaaS的形式提供给客户。你可以按照实例为单位进行购买申请不同标准规格的PG实例&#xff0c;然后构建自己的业务逻辑。Hyperscaler是这套产品或方…

【Python-Docx库】Word与Python的完美结合

今天给大家分享Python处理Word的第三方库&#xff1a;Python-Docx。 什么是Python-Docx&#xff1f; Python-Docx是用于创建和更新Microsoft Word&#xff08;.docx&#xff09;文件的Python库。 日常需要经常处理Word文档&#xff0c;用Python的免费第三方包&#xff1a;Pyt…