Linux环境变量【终】

🌎环境变量


文章目录:

环境变量

    环境变量的组织方式

      创建自己的环境变量
      main函数参数
      C语言提供的变量与接口

    环境变量与本地变量

      了解本地变量
      取消本地变量和环境变量

    环境变量的出处

    总结


前言:

  上次我们简单了解了一下环境变量这个概念,今天我们继续深入了解。话不多说,开启我们今天的话题!

在这里插入图片描述


🚀环境变量的组织方式

✈️创建自己的环境变量

  我们有时候也需要配置自己的环境变量,我们可以使用如下命令:

export 变量名=内容

在这里插入图片描述
在这里插入图片描述
  这样就能创建自己的环境变量了。


✈️main函数参数

  在main函数中其实还存在一个参数:char *env[],和 argv类似,也是一个指针数组,不同的是 env的每一个指针指向的是每一行的环境变量

  我们不妨做实验将其打印出来观察:

#include<stdio.h>
#include<stdlib.h>int main(int argc, char *argv[], char *env[])
{for(int i = 0 ; env[i] ; ++i){printf("————————————————env[%d] -> %s\n", i, env[i);//为了能看出来我们是在打印}return 0;
}

在这里插入图片描述

  我们可以看到,打印出来的正是我们系统中所有的环境变量。

在这里插入图片描述

  每个程序都会收到一张环境表,环境表 是一个字符指针数组,每个指针指向环境变量字符串,也就是main函数的 env 参数。


✈️C语言提供的变量与接口

  C语言中除了main函数参数有 环境表 以外,C语言还为我们提供了第三方变量:

在这里插入图片描述
  很明显,这是一个二级指针,而它的最终指向也就是环境变量表。那么我们来证明一下:

  1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6     extern char **environ;7     for(int i = 0; environ[i] ; ++i)8     {9         printf("environ[%d]:%s\n", i, environ[i]);                                                                                                         10     }11     return 0;12 }


  那么程序是如何拿到环境变量表的呢?我们都知道,程序的默认父进程都是bash,那么程序就是bash的子进程,而子进程的 环境变量表其实就是从父进程bash那里继承的

  除了环境变量以外,我们也可以用 getenv 接口获取环境变量:

在这里插入图片描述
  这里需要注意的是,getenv里的内容是环境变量的名称,通过这个名称返回对应的字符串,比如下面这段代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>int main()
{const char* username = getenv("USER");if(strcmp(username, "xzy") == 0){printf("this is my process core function!\n");}else {printf("your privilege low!\n");}return 0;
}

在这里插入图片描述


🚀环境变量与本地变量

✈️了解本地变量

  使用env命令只能查看环境变量,但是使用下面的命令可以查看所有的变量:

set #查看本地变量和环境变量

在这里插入图片描述
  也就是说,set不仅仅可以查看所有的环境变量,而且还可以查看本地变量。我们来看一个有趣的现象:

在这里插入图片描述
  export 我们刚刚学过,是导出自定义环境变量的命令,可以下面这个 HEHE 为什么不使用export也能定义出来?它也是环境变变量吗?而且还能被echo识别?我们不妨先看下面一段代码:

 1: myenv.c ? ?                                                                                                             ?? buffers 1 #include<stdio.h>2 #include<stdlib.h>3 #include<unistd.h>4 5 int main()6 {7     const char* myenv = getenv("HAHA");8     if(myenv == NULL) printf("get environ null!\n ");9     else printf("myenv:%s\n", myenv);                                                                                               10     return 0;                                                                                                                  11 }   

在这里插入图片描述
  我们把HAHA 换为 HEHE再看看结果:

在这里插入图片描述
在这里插入图片描述
  我们可以看到,这个时候getenv检测不出来这个 “环境变量”。

  其实,这个变量叫做 本地变量,至于为什么本地变量不能被getenv获取,这是因为 本地变量不是环境变量,本地变量只在bash有效,子进程不会继承本地变量

区别:

环境变量本地变量
作用范围环境变量是在操作系统级别定义的变量,可以被所有的子进程继承并使用,对整个系统和所有用户都有效本地变量只在定义它的当前 shell 进程中有效,对于其它的子进程不可见
存储位置环境变量通常存储在系统级别的配置文件中本地变量则只存在于当前 shell 进程的运行环境中
继承性环境变量可以被子进程继承并使用,对系统中所有的进程都是全局可见的本地变量不能被子进程继承。如果需要将本地变量转换成环境变量,可以使用export命令

✈️取消本地变量和环境变量

  如果我们自定义的环境变量或者本地变量现在不想要了,我们可以使用这条指令:

unset 环境/本地变量名#取消环境/本地变量

  比如删除我们刚刚的 HEHE 和 HAHA:

在这里插入图片描述
  这样就将 环境/本地变量删除了。


🚀环境变量的出处

  不知道大家有没有想过,我们环境变量是存在哪的呢?为什么我们开机就有这些环境变量或者本地变量呢?

  上次我们也说了,为什么我们导入的环境变量重启会消失,是因为 我们操作是内存级的,并没有保存到磁盘,而每次重启内存数据丢弃,从磁盘重新拷贝数据到内存。

  那么究竟是哪个文件?我来带大家看一看:

在这里插入图片描述
  在Linux操作系统的家目录当中,隐藏文件有这样一个文件:.bash_profile文件,我们打开这个文件:

在这里插入图片描述

  其实这就是一个脚本文件,用来导入环境变量,系统启动时,bash会读取这个脚本文件,从而获取环境变量

  而今天我们想要一个重新登陆也能使用的自定义环境变量,那么我们就可以在下方把环境变量写入并保存即可:

在这里插入图片描述
  我们保存后到终端页面,使用下面命令让文件生效,那么这个环境变量就生效了:

source .bash_profile#使bash_profile内的环境变量生效

  当然我这台机器的Linux系统bash_profile文件并未生效,可能是登录时bash并未读取.bash_profile文件,所以不能生效,但是大部分人应该是没问题的。


📒✏️总结

  •  我们了解了main函数第三个参数可以获取环境变量,以及一个变量和一个接口可获取环境变量表。
  •  我们了解了什么是环境变量什么是本地变量。
  •  我们学习了如何永久导入环境变量以及如何删除环境变量或本地变量。

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

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

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

相关文章

JavaScript 权威指南第七版(GPT 重译)(六)

第十五章&#xff1a;JavaScript 在 Web 浏览器中 JavaScript 语言是在 1994 年创建的&#xff0c;旨在使 Web 浏览器显示的文档具有动态行为。自那时以来&#xff0c;该语言已经发生了显著的演变&#xff0c;与此同时&#xff0c;Web 平台的范围和功能也迅速增长。今天&#…

小程序配置服务器域名

首先登录小程序,点击左侧的开发管理菜单 然后找到服务器域名点击后面的修改按钮 在弹框中验证管理员的身份后出现如图所示的界面: 修改自己的域名后保存提交即可

Centos上安装Harbor并使用

harbor的安装与使用 Harbor介绍安装前的准备工作为Harbor自签发证书安装Harbor安装docker开启包转发功能和修改内核参数安装harbor扩展 Harbor 图像化界面使用说明测试使用harbor私有镜像仓库从harbor仓库下载镜像 Harbor介绍 容器应用的开发和运行离不开可靠的 镜像管理&…

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…

颠覆传统:Web3如何塑造未来的数字经济

引言 近年来&#xff0c;随着数字化时代的到来&#xff0c;互联网已经成为人们生活中不可或缺的一部分。然而&#xff0c;随着技术的不断发展和社会的不断变迁&#xff0c;传统的Web2模式逐渐显露出一些弊端&#xff0c;如数据垄断、隐私泄露等问题&#xff0c;这促使人们寻求…

ArmSoM-Sige RK3588开发板产品简介

让我们在 5 分钟内了解 Sige7。 简介​ ArmSoM-Sige7采用Rockchip RK3588新一代旗舰级八核64位处理器&#xff0c;主频高达2.4GHz&#xff0c;6 TOPS算力NPU&#xff0c;最大可配32GB大内存。支持8K视频编解码&#xff0c;拥有丰富的接口&#xff0c;支持双2.5G网口、WiFi6 &…

仿《Egouz国外网址大全》源码 SEO网站大全 外国网址导航网站模板 手机版+采集

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 源码介绍: 基于帝国CMS7.5核心开发仿…

K8S--SpringCloud应用整合Nacos实战

原文网址&#xff1a;K8S--SpringCloud应用整合Nacos实战-CSDN博客 简介 本文介绍K8S部署SpringCloud应用整合Nacos实战。 本文是将原来的SpringCloud项目&#xff08;闪速优选&#xff09;迁移到K8S上&#xff0c;一行代码都不需要改动。用K8S运行Nacos、Gateway、SpringCl…

每日一题 --- 设计链表[力扣][Go]

设计链表 题目&#xff1a;707. 设计链表 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则…

Codeforces Round 930 (Div. 2)(A,B,C,D)

比赛链接 C是个交互&#xff0c;D是个前缀和加二分。D还是很难写的。 A. Shuffle Party 题意&#xff1a; 您将得到一个数组 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​ 。最初&#xff0c;每个 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n 对应 a i i a_ii…

【Linux】从零认识进程 — 中下篇

送给大家一句话&#xff1a; 人一切的痛苦&#xff0c;本质上都是对自己无能的愤怒。而自律&#xff0c;恰恰是解决人生痛苦的根本途径。—— 王小波 从零认识进程 1 进程优先级1.1 什么是优先级1.2 为什么要有优先级1.3 Linux优先级的特点 && 查看方式1.4 其他概念 2…

目标检测的指标评估

目标检测模型的评价指标主要用于衡量模型的性能&#xff0c;特别是它在定位和识别目标方面的准确性。以下是一些常见的评价指标&#xff1a; 1. 精确度 (Precision): 表示检测到的目标中&#xff0c;正确检测到的目标所占的比例。精确度高意味着模型产生的误报&#xff08;错误…

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…

Oracle 使用OGG(Oracle GoldenGate) 实现19c PDB与MySQL5.7 数据同步

OGG 是一种基于日志的结构化数据复制软件&#xff0c;它通过解析源数据库在线日志或归档日志获得数据的增删改变化。 OracleMysqlIP address192.168.80.100192.168.80.16DB version19.2.05.7host nametempmysql OS version&#xff1a; CentOS 7.9 一&#xff0c;Oracle 服务…

机器学习基础知识面经(个人记录)

朴素贝叶斯 特征为理想状态下的独立同分布&#xff0c;作为机器学习的重要基石和工具 由贝叶斯公式推导而来 是后验概率&#xff1a;在B发生的条件下A发生的概率。 是似然概率: 在 发生的条件下 发生的概率。 是先验概率: 发生的概率&#xff0c;而不考虑 的影响。 是…

静态综合实验

一.搭建拓扑结构 1.根据拓扑结构可以把网段分成14个网段&#xff0c;根据192.168.1.0/24可以划分出ip地址和环回地址 其中环回r1分别是 192.168.1.32/27 192.168.1.32/28 192.168.1.48/28 2.划分完后如图&#xff1a; 二.配置IP地址 注意&#xff1a;为了避免错误&#…

vulnhub prime1通关

目录 环境安装 1.信息收集 收集IP 端口扫描 目录扫描 目录文件扫描 查找参数 打Boss 远程文件读取 木马文件写入 权限提升 方法一 解锁密钥 方法二&#xff1a; linux内核漏洞提权 总结 环境安装 Kali2021.4及其prime靶机 靶机安装&#xff1a;Prime: 1 ~ Vul…

今天聊聊新零售

一、什么是新零售&#xff1f; 2016年&#xff0c;在杭州举行的“云栖大会”上&#xff0c;马云发表了讲话&#xff0c;首次提出了“新零售”这一概念。 1.1 新零售概念 新零售&#xff0c;英文是New Retailing&#xff0c;新零售是对人货场的重构。人是消费者、销售人员、…

Python 从0开始 一步步基于Django创建项目(3)使用Admin site管理数据模型

本文内容建立在《Python 从0开始 一步步基于Django创建项目&#xff08;2&#xff09;创建应用程序&数据模型》的基础上。 Django提供的admin site&#xff0c;使得网站管理员&#xff0c;能够轻松管理网站的数据模型。 本文首先创建‘管理员账户’&#xff0c;即超级用户…

Linux:Jenkins全自动持续集成持续部署(3)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…