Linux初识环境变量

🌎环境变量【上】


文章目录:

环境变量

    什么是环境变量

    关于命令行参数

    环境变量
      简单了解
      为什么需要环境变量
      系统中其他环境变量

    总结


前言:

  环境变量是一种非常重要的概念,它们对于系统的行为和应用程序的运行起着关键作用。那么话不多说,开启我们今天的话题!

在这里插入图片描述


🚀什么是环境变量

  学习jvav的同学肯定都配置过环境变量,配置环境这一块可能就是劝退一些同学的原因:

在这里插入图片描述
  那么它究竟是什么呢?环境变量(environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数。

  比如:我们在写C/C++的代码时,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  简单来说,整个系统就像一个王国,而每个文件就是王国大大小小的土地,这天你需要走到国都,难不成把全国走完找到国都吗?我们可以打开某德地图,直接搜索就会显示出到王都的路,去王都的路线其实就可以看作环境变量。


🚀关于命令行参数

  在C/C++中,我们main函数能不能带参数?实际上是可以的:

int main(int argc, char *argv[])//main函数的形参
{return 0;
}

  main函数参数其中两个参数为 int argcchar *argv[],其中 argv是指针数组,里面存的全是指针变量,这里我告诉你 argc是argv数组的元素个数,那么argv数组究竟存着什么东西?我们不妨做个实验:

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

  

  我们发现,argv保存的内容恰好是我们向命令行解释器输入的内容,我们不妨在命令后多加几个选项:

在这里插入图片描述
  这里的结果就很明显了,bash 将我们命令行参数以空格为分隔符转化为一个个的子串,并且 argv里的每一个指针按照顺序指向不同的子串

  说到字符串,我们无论实在Linux还是Windows或者其他系统,都有命令行提示符,他们是怎么构成的?

在这里插入图片描述
  这里用C语言帮助大家理解:

printf("[xzy@iZ0jle4p97d8x4byf3u32mZ Test2]$");//bash命令行提示符
char buff[1024];
scanf("%s", buff);//or gets

  就像我们上面写的这段代码,打印一句话用来表示命令行提示符,使用数组接收我们输入的命令,虽然没这么简单,但是原理类似。

  我们输入的命令被转化成了一整个字符串,以空格作为分隔符,将整个字符串转化为
一个一个的子串

在这里插入图片描述

    而这些被截取的子串,被bash放在argv的指针数组里,这样就形成了一张表,称之为 命令行参数表。并且 每张命令行参数表都 以NULL结尾,我们可以来验证一下:

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

  既然以NULL结尾,而NULL的字面意义就是0,那我们的循环以argv[i]为循环体按理来说也是可以的:

在这里插入图片描述
  所以这样也能获取到我们的命令行参数。现在我们知道了C语言 main函数中两个参数是由bash维护并创建和传参的。但是为什么要这么做?

  我们以下面一段代码来帮助理解:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 5 6 //三个选项实现三个不同的功能                                                                                                                                                                                    7 int main(int argc, char *argv[])8 {9     if(argc != 2)10     {11         printf("Usage:\n\t%s -number[1-3]\n",argv[0]);12     }13 14     if(strcmp("-1", argv[1]) == 0)15     {16         printf("function1\n");17     }18     else if(strcmp("-2", argv[1]) == 0)19     {20         printf("function2\n");21     }22     else if(strcmp("-3", argv[1]) == 0)23     {24         printf("function3\n");25     }26     else27     {28         printf("unknown!\n");29     }30     return 0;31 }

  上面是我们根据输入的命令行参数的选项来做不同功能的函数:

在这里插入图片描述
  这样我们就可以通过不同的选项,让我们同一个程序执行它内部不同的功能。

  这个功能是不是很像我们的指令?(比如:ls 指令)

在这里插入图片描述
  为什么我们指令可以根据不同的选项而做出不同的动作?原因就在于我们的选项传递到main函数中的 argc 和 argv当中,所以能够完成同一个指令根据不同选项做出对应的功能。

  所以,选项的本质就是命令行参数!

  我们来根据上面的代码优化为具体的功能:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 5 6 //实现不同的算数功能7 int main(int argc, char *argv[])8 {9     if(argc != 4)10     {11         printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n",argv[0]);12     }13 14     int x = atoi(argv[2]);15     int y = atoi(argv[3]);16 17     if(strcmp("-add", argv[1]) == 0)18     {19         printf("%d + %d = %d\n", x, y, x + y);20     }21     else if(strcmp("-sub", argv[1]) == 0)22     {23         printf("%d - %d = %d\n", x, y, x - y);24     }25     else if(strcmp("-mul", argv[1]) == 0)26     {27         printf("%d * %d = %d\n", x, y, x * y);28     }29     else if(strcmp("-div", argv[1]) == 0)30     {31         printf("%d / %d = %d\n", x, y, x/y);                                                                                                                             32     }33     else34     {35         printf("unknown!\n");36     }37     return 0;38 }
~

在这里插入图片描述
  所以通过以上的例子,我们可以深刻理解,命令行参数时Linux选项的基础。


🚀环境变量

✈️简单了解

  环境变量不是一个,而是一堆,他们彼此并没有什么关系。环境变量,一般是系统内置的具有特殊用途的变量。

  环境变量有“变量”两个字,而我们都知道,变量的本质其实是开辟空间,在运行期间我们的程序也能开辟空间

  但是环境变量,并不是我们语言意义上的变量,操作系统/bash 是用C语言写的,系统的环境变量就是系统自己开辟的空间,给他名字和内容即可

  至于为什么叫做变量?因为环境变量的本质和语言中变量的本质没什么大的区别,而且环境变量也是可以更改的,所以被形象的称为 “变量”。


✈️为什么需要环境变量

  我们先来看一个现象:

在这里插入图片描述

  我们为什么一定要使用 ./才能运行我们写的程序,而像ls,pwd等等这些命令却不需要使用./呢?

  这就是因为在系统当中 存在一个 全局的 环境变量, 叫做 PATH,今天我们要看一看这个环境变量,需要使用如下指令:

echo $环境变量名#查看环境变量

在这里插入图片描述

  我们执行的任何命令都会在通过该环境变量目录下进行搜索,可以看到这里不仅仅只有一个路径,当一个路径内没找到就会去下一个路径进行搜索,直到将最后一个路径查找完,如果依旧没发现则就会出现上面那种情况。

  但是今天,我就是想要自己的程序不带 ./ 也能运行起来,当然可以,我们有两种做法:

1、拷贝到环境变量内对应的bin目录下:

在这里插入图片描述
  这个时候就能不使用 ./ 就可以运行我们的程序了。

  其实这个过程就相当于把我们的程序安装到系统里,因为这是个半成品,我并不推荐这样做,这样做会污染我们系统的默认命令值。

2、把我们程序当前的路径添加到环境变量中

在这里插入图片描述

  这样我们就把程序添加进环境变量中了,但是为了保证原PATH值还存在要在 末尾加上 :$PATH 即可

  如果不小心忘记把原来的环境变量加上:

在这里插入图片描述

  这个时候其他的命令全部用不了了,这个时候不要急,我们只需要退出重登即可:

在这里插入图片描述

  这是因为当前仅仅是在内存中更改了环境变量,并没有在磁盘中更改,所以 重新登录还是从磁盘拿数据,就能恢复如初了。


✈️系统中其他环境变量

  为什么一开始系统就会知道我们的路径?其实在系统中存在 PWD 环境变量,我们 每一次对路径做修改都会被 PWD 所记录

在这里插入图片描述
  甚至我们当前登录的用户是谁,也是有环境变量记录的:

在这里插入图片描述
  系统中还有很多很多环境变量,我们可以使用 env 命令查看:

在这里插入图片描述
  系统其实就是通过维护这么一大串的环境变量,所以系统才能通过环境变量认识 “你”。


📒✏️总结

  •   环境变量是系统中很重要的一个东西,系统是 通过所有的环境变量来认识你 的。
  •  main函数里的参数其实就是命令行参数的个数和字符串。
  •  让自己的程序能像指令一样运行有两种方法,一种是将指令添加到bin目录下,另一种是将程序地址放在PATH环境变量当中

在这里插入图片描述
  如果这篇文章对你有帮助的话,还望留下一个小小的赞支持博主呀~~

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

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

相关文章

TH-FBCQX2防爆气象站

TH-FBCQX2防爆气象站主要适用于易燃易爆、危险性高的场所。以下是其主要的适用领域&#xff1a; 石油与天然气行业&#xff1a;在石油和天然气的生产、储存和运输过程中&#xff0c;防爆气象站可以监测环境中的可燃气体浓度&#xff0c;并根据气象条件预测爆炸风险。同时&…

Machine Learning ---- Gradient Descent

目录 一、The concept of gradient&#xff1a; ① In a univariate function&#xff1a; ②In multivariate functions&#xff1a; 二、Introduction of gradient descent cases&#xff1a; 三、Gradient descent formula and its simple understanding: 四、Formula o…

【sql】深入理解 mysql的EXISTS 语法

相关文章&#xff1a; 【sql】深入理解 mysql的EXISTS 语法 【sql】初识 where EXISTS 1. 使用格式如下&#xff1a; select * from a where exists ( 任何子查询 ) 代码根据颜色分成两段&#xff0c;前面的是主查询&#xff0c;后面红色的是子查询&#xff0c;先主后子&…

Android弹出通知

发现把Android通知渠道的重要性设置为最高时&#xff0c;当发送通知时&#xff0c;通知能直接弹出来显示&#xff0c;以前一直搞不明白为什么别的app的通知可以弹出来&#xff0c;我的不行&#xff0c;搞了半天原来是这个属性在作怪&#xff0c;示例如下&#xff1a; class Ma…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

后端工程师快速使用axios

文章目录 01.AJAX 概念和 axios 使用模板目标讲解代码解析案例前端后端结果截图 02.URL 查询参数模板目标讲解案例前端后端结果截图 03.常用请求方法和数据提交模板目标讲解案例前端后端结果截图 04.axios 错误处理模板目标讲解案例前端后端结果截图 01.AJAX 概念和 axios 使用…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

ASP.NET Core 8.0 WebApi 从零开始学习JWT登录认证

文章目录 前言相关链接Nuget选择知识补充JWT不是加密算法可逆加密和不可逆加密 普通Jwt&#xff08;不推荐&#xff09;项目环境Nuget 最小JWT测试在WebApi中简单使用简单使用运行结果 WebApi 授权&#xff0c;博客太老了&#xff0c;尝试失败 WebApi .net core 8.0 最新版Jwt …

笔记本插入耳机没有声音

笔记本插入耳机没有声音&#xff0c;有可能是因为音频设置问题 打开声音小喇叭&#xff0c;选择耳机频道就好了

【Qt图形界面引擎(一)】:第一个Qt程序

跨平台图形界面引擎&#xff0c;接口简单&#xff0c;易上手&#xff0c;一定程度简化内存。 Qt发展史 1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架2008年&#xff0c;Qt Company科技被诺基亚公司收购&#xff0c;Qt也因此成为诺基亚旗下的编程语言工具2012…

数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署

简介 随着数字人物概念的兴起和生成技术的不断发展&#xff0c;将照片中的人物与音频输入进行同步变得越来越容易。然而&#xff0c;目前仍存在一些问题&#xff0c;比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题&#xff0c;来自西安…

【软件工程】一份完整的软件工程实践论文格式

一份完整的软件工程实践论文格式 记录一下&#xff0c;以备不时之需&#xff01; 目 录 第1章 绪 论 1.1 课题背景 1.2 课题意义 1.3 国内外现状 2 第2章 系统关键技术 4 2.1 开发技术 4 2.2 MVVM模式 4 2.3 MySQL数据库 4 2.4 B/S结构 5 2.5 框架介绍 5 2.6 Vue.js主要功能 6…

sentinel熔断降级

熔断降级 Slot 责任链上的最后一环&#xff1a;熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中&#xff0c;有时需要大屏…

聊聊Go程序是如何运行的

写在文章开头 Go语言是一门编译语言&#xff0c;其工作过程即直接通过编译生成各大操作系统的机器码即可直接执行&#xff0c;所以这篇文章笔者就从底层汇编码的角度聊一聊Go语言是如何运行的。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java c…

IntelliJ IDEA 设置运行时环境变量

背景 博主要测试langchain4j&#xff0c;运行时需要OPENAI_BASE_URL和OPENAI_API_KEY这两个环境变量的值。 临时设置 Run -> Edit Configurations -> Edit Environmental Variables 永久设置 在系统环境变量中设置&#xff0c;教程无数。 注意&#xff1a;windows在…

MATLAB教程

目录 前言一、MATLAB基本操作1.1 界面简介1.2 搜索路径1.3 交互式命令操作1.4 帮助系统 二、MATLAB语言基础2.1 数据类型2.2 MATLAB运算2.2.1 算数运算2.2.2 关系运算2.2.3 逻辑运算 2.3 常用内部函数2.4 结构数据与单元数据 三、MATLAB程序设计3.1 M文件3.2 函数文件3.3 程序控…

c#接口 axios的get请求url过长时该怎么做

今天又碰到了&#xff0c;大托参数拼在url里用get传 1、改服务器最大字数限制&#xff08;还是会错&#xff09; 2、改post&#xff08;有些还要跟着把[FromUri]改成[FromBody]&#xff09;

windows查看局域网内所有已使用的IP IP扫描工具 扫描网段下所有的IP Windows环境下

推荐使用&#xff1a; Advanced IP Scanner 官网下载&#xff1a; https://www.advanced-ip-scanner.com/

sqllab第35-45关通关笔记

35关知识点&#xff1a; 宽字节注入数值型注入错误注入 payload:id1andextractvalue(1,concat(0x7e,database(),0x7e))0--联合注入 payload:id0unionselect1,database(),version()-- 36关知识点&#xff1a; 字符型注入宽字节注入错误注入 payload:id1%df%27andextractvalue(…