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.mzph.cn/news/757220.shtml

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

相关文章

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Spring学习记录之依赖注入

问题1&#xff1a; 往一个类中传递数据的方式有哪些呢&#xff0c;其实&#xff0c;只有一种方式&#xff0c;即通过方法&#xff0c;但方法却有多种&#xff0c;一种是我们先前学到的通过set方法&#xff08;普通方法&#xff09;&#xff0c;另一种则是通过构造方法的方式。…

【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于GHS推出的最新编译器版本 Compiler 2023.5.4在GHS以前版本的MULTI IDE上面能否使用的问题 2、 问题场景 针对于&#xff0c;客户使用MULTI IDE 8.1.4以前的IDE版本&#xff0c;想要搭载使用最新版本的编译器…

c++ 模拟 三维数组输入 string转化为int

// 函数用于将字符串解析为三维数组 vector<vector<vector<int>>> parseString3(string& input) { //[[[0,1,0,0,2],[1,2,1,2,1],[1,0,1,0,0],[0,1,2,0,0],[1,1,0,0,2]]] vector<vector<vector<int>>> result1; vector<…

Python爬虫-数据采集和处理

文章目录 数据数据类型 数据分析过程数据采集数据采集源数据采集方法 数据清洗清洗数据数据集成数据转换数据脱敏 数据 《春秋左传集解》云&#xff1a;“事大大其绳&#xff0c;事小小其绳。”体现了早期人类将事情的“大小”这一性质抽象到“绳结大小”这一符号上从而产生数…

(保姆级)离线安装mongoDB集群

Docker搭建MongoDB集群 副本集模式&#xff08;Replica Set&#xff09; 是一种互为主从的关系&#xff0c; Replica Set 将数据复制多份保存&#xff0c;不同服务器保存同一份数据&#xff0c;在出现故障时自动切换&#xff0c;实现故障转移。 此集群拥有一个主节点和多个从…

【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录 0. 前言1. 基本用法1.1 转换为Tensor1.2 图像大小调整1.3 随机裁剪1.4 中心裁剪1.5 随机翻转1.6 随机旋转1.7 填充1.8 组合变换 2. 进阶用法2.1 归一化2.2 色彩空间转换2.3 颜色抖动2.4 随机仿射2.5 透视变换2.6 自定义变换 0. 前言 按照国际惯例&#xff0c;首先声明…

Spring Data访问Elasticsearch----路由值Routing values

Spring Data访问Elasticsearch----路由值Routing values 一、join-types的路由二、自定义路由值 当Elasticsearch将文档存储在具有多个分片的索引中时&#xff0c;它会根据文档的id确定要使用的分片。有时有必要预先定义多个文档应该在同一个shard上建立索引&#xff08;join-t…

Day51-Nginx多实例知识与大厂企业级实战

Day51-Nginx多实例知识与大厂企业级实战 1. 什么是nginx多实例&#xff1f;2. 为什么要用多实例&#xff1f;3. 大厂数百个业务项目&#xff0c;如何来管理&#xff1f;4. 大厂上百项目web分用户解决方案4.1 编译nginx环境实践&#xff1a;4.2 zuma实例(利用普通用户权限将不同…

LeetCode题练习与总结:组合总和Ⅱ

一、题目 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 二、解题思路 排序&#xff1a…

前端项目,个人笔记(二)【Vue-cli - 引入阿里矢量库图标 + 吸顶交互 + setup语法糖】

目录 1、项目中引入阿里矢量库图标 2、实现吸顶交互 3、语法糖--<script setup> 3.1、无需return 3.2、子组件接收父组件的值-props的使用 3.3、注册组件 1、项目中引入阿里矢量库图标 步骤一&#xff1a;进入阿里矢量库官网中&#xff1a;iconfont-阿里巴巴矢量…

教务管理系统(java+mysql+jdbc+Druid+三层架构)

1、项目要求 1.1数据库表描述 设计一个教务管理系统&#xff0c;要求如下&#xff1a; 系统涉及的表有 account表&#xff08;账号表&#xff09; teacher表&#xff08;教师表&#xff09; student表&#xff08;学生表&#xff09; course表 (课程表) score表&#xff08;成…

拦截器(springboot)

1、拦截器介绍 在SpringBoot中&#xff0c;拦截器是一种用于拦截请求并在处理请求之前或之后执行特定操作的机制。 拦截器可以用于实现一些通用的功能&#xff0c;例如身份验证、日志记录、性能监控等。 Springboot中的拦截器是通过实现HandlerInterceptor接口来实现的&#x…

[Halcon学习笔记]机器视觉缺陷检测常用方法对比总结

1、介绍 缺陷检测时机器视觉需求中最复杂难度较大的一类需求。究其原因&#xff0c;主要是在项目开发过程中首先要保证检测的稳定性和精度&#xff0c;又要实现缺陷检测的通用性&#xff0c;常见的缺陷&#xff1a;凹凸、污点瑕疵、划痕、裂缝、伤痕、毛刺等等类型种类繁杂&am…

uniapp 使用sqlite时无法读取到db文件中的数据

问题 {“code”:-1404,“message”:“android.database.sqlite.SQLiteException: no such table: user (Sqlite code 1): , while compiling: select * from user, (OS error - 2:No such file or directory),http://ask.dcloud.net.cn/article/282”} at pages/index/index.vu…

Python内置对象

Python是一种强大的、动态类型的高级编程语言&#xff0c;其内置对象是构成程序的基础元素。Python的内置对象包括数字、字符串、列表、元组、字典、集合、布尔值和None等&#xff0c;每种对象都有特定的类型和用途。 01 什么是内置对象 这些对象是编程语言的基础构建块&…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

【AI案例】做AI视频如何实现数字人实时口型同步

首先,这个方案提供了一个令人瞩目的实时唇语同步API。这一技术能够将任何视频与任何语言的音频进行视觉配音,而且无需繁琐的训练过程。这样的功能极大地拓宽了视频内容的传播范围,使得无论语言背景如何,人们都能够理解并享受视频内容。 其次,这个API的适用性非常广泛,无…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

第十三届“中关村青联杯”全国研究生数学建模竞赛-A题:多无人机协同任务规划(续)

目录 7.2 模型三的建立与求解 8 问题四:针对远程雷达的分步优化模型 9 问题五:模型分析