Linux初识环境变量

news2024/9/21 0:40:42

🌎环境变量【上】


文章目录:

环境变量

    什么是环境变量

    关于命令行参数

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

    总结


前言:

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

在这里插入图片描述


🚀什么是环境变量

  学习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     else
 27     {
 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     else
 34     {
 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.coloradmin.cn/o/1527885.html

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Path)

路径绘制组件&#xff0c;根据绘制路径生成封闭的自定义形状。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Path(value?: { width?: number | string; height?: number |…

OpenResty使用Lua大全(九)实战:nginx-lua-redis实现访问频率控制

文章目录 系列文章索引一、需求背景二、设计方案1、预期结果2、nginx.conf配置3、access_by_limit_frequency.lua4、测试 系列文章索引 OpenResty使用Lua大全&#xff08;一&#xff09;Lua语法入门实战 OpenResty使用Lua大全&#xff08;二&#xff09;在OpenResty中使用Lua …

Django 反向解析路由

app2.urls.py from django.urls import path, re_path from . import viewsurlpatterns [path(index, views.index, nameindex),path(url_reverse, views.url_reverse, nameapp2_url_reverse), # 使用reverse()方法反向解析 ,name对于视图的reverse("app2_url_reverse&…

鼎阳SDS6204示波器EPICS IOC的搭建

三年前曾写过这个文&#xff1a; 鼎阳SDS6204示波器的EPICS IOC调试 文章里有EPICS网站设备IOC搭建的指南&#xff0c;具体搭建IOC的步骤就没详细写了&#xff0c;几年后重新搭建时发现还是费了些力气才搭建起来&#xff0c;因此写此文记录下手把手的过程方便自己以及EPICS的初…

阿里云云服务器ECS端口多个端口号开通教程

阿里云云服务器ECS端口多个端口号开通教程 1、登录到ECS云服务器管理控制台 2、左侧栏找到【实例与镜像】>>【实例】&#xff0c;找到目标ECS实例&#xff0c;点击实例ID进入到实例详情页 3、切换到【安全组】页面&#xff0c;点击右侧【配置规则】&#xff0c;如下图&…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user&…

【深度学习】手动实现全连接神经网络(FCNN)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 神经网络的本质就是通过参数、线性函数与激活函数来拟合特征与目标之间的真实函数关系。 01 神经网络简介 1.1 引入 神经网络是一门重要的机器学习技术&…

hosts文件丢失了怎么办?

hosts文件的位置&#xff1a;C:\Windows\System32\drivers\etc 丢失了恢复的方法&#xff1a; 在“管理员&#xff1a;命令提示符中输入&#xff1a; &#xff08;winR 然后cmd&#xff09; for /f %P in (dir %windir%\WinSxS\hosts /b /s) do copy %P %windir%\System32\d…

SAP前台处理:物料主数据创建<MM01>之采购视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

SpringMVC | SpringMVC中的“JSON数据交互“ 和“RESTful支持“

目录: 1.JSON 数据交互1.1 JSON概述1.2 JSON的“数据结构”对象结构数组结构 1.3 JSON的“数据转换” (JSON交互) 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 该文章参考学习教…

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二&#xff1a;Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#xff0c;也意味着它…

工业AMR机器人如何实现规模化的柔性生产

在当下高度复杂的工业生产环境中&#xff0c;机器人如何实现规模化的柔性生产&#xff0c;已成为业界关注的焦点。特别是在追求高效率、高质量的生产过程中&#xff0c;团队协作的重要性愈发凸显。富唯智能一体化AMR控制系统&#xff0c;作为机器人的核心指挥部&#xff0c;犹如…

VMware安装Centos 6.5系统

文章目录 镜像下载地址1.在vmware中新建虚拟机2.选择标准典型步骤进行安装3.选择以后再放入光盘4.选择准备安装的系统类型5.为虚拟机指定名称并指定位置6.磁盘空间20G默认下一步&#xff1b;7.将无用的硬件删除掉8.点击打开虚拟机&#xff1b;9.选择第一个回车进行全新安装&…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

Django templates 存放html目录

模板 一概述 模板由两部分组成&#xff0c;一部分是HTML代码&#xff0c;一部分是逻辑控制代码&#xff08;变量&#xff0c;标签&#xff0c;过滤器&#xff09; 作用&#xff1a;可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码&#xff0c;并且实现简单的…