Linux环境变量【终】

news2024/11/27 21:05:49

🌎环境变量


文章目录:

环境变量

    环境变量的组织方式

      创建自己的环境变量
      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.coloradmin.cn/o/1530443.html

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

相关文章

【RK3399 -PCIE移植过程记录】

一、&#xff0c;pcie开发可通过参考官方开发文档&#xff1a; 具体的硬件外设都有官网的参考文档&#xff0c;pcie的具体可参考&#xff1a; https://github.com/mfkiwl/rk-open-docs/blob/master/PCIe/Rockchip_RK3399_Developer_Guide_PCIe_CN.md 二、具体设备树文件 vi …

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…

数据在内存中的存储(C语言)(难点,需多刷几遍)

目录 整数在内存中的存储 大小端字节序和字节序判断 什么是大小端&#xff1f; 为什么有大小端&#xff1f; 练习1 练习2 练习3 练习4 练习5 练习6&#xff08;较难、重点&#xff09; 代码解读&#xff1a; 浮点数在内存中的存储 练习 浮点数的存储 浮点数存的…

Redis之缓存穿透、缓存雪崩、缓存击穿

Redis之缓存穿透、缓存雪崩、缓存击穿 什么是缓存穿透&#xff1f; 如果有人故意将请求打到未缓存的数据上&#xff0c;会对数据库造成巨大的压力 如何解决&#xff1f; 做好参数校验&#xff0c;比如请求的id不能<0&#xff0c;在访问数据库前就把这些异常访问拦截了 缓…

nginx搭建及部署

目录 一、nginx是什么&#xff1f; 二、安装部署 1.下载 2.配置 3.代理Swagger服务 4.nginx命令 一、nginx是什么&#xff1f; 是用于 Web 服务、反向代理、内容缓存、负载均衡、媒体流传输等场景的开源软件。它最初是一款专为实现最高性能和稳定性而设计的 Web 服务器。…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

Data-Free Generalized Zero-Shot Learning 中文版

摘要 深度学习模型具有从大规模数据集中提取丰富知识的能力。然而&#xff0c;由于涉及到数据版权和隐私问题&#xff0c;数据共享变得越来越具有挑战性。因此&#xff0c;这妨碍了从现有数据向新的下游任务和概念有效转移知识。零样本学习&#xff08;ZSL&#xff09;方法旨在…

MNN Session 创建执行器(六)

系列文章目录 MNN createFromBuffer&#xff08;一&#xff09; MNN createRuntime&#xff08;二&#xff09; MNN createSession 之 Schedule&#xff08;三&#xff09; MNN createSession 之创建流水线后端&#xff08;四&#xff09; MNN Session::resize 之流水线编码&am…

element-ui出的treeselect下拉树组件基本使用,以及只能选择叶子节点的功能,给节点添加按钮操作

element-ui出的treeselect下拉树组件基本使用&#xff1a;Vue通用下拉树组件riophae/vue-treeselect的使用-CSDN博客 vue-treeselect 问题合集、好用的树形下拉组件&#xff08;vue-treeselect的使用、相关问题解决方案&#xff09;-CSDN博客 需求1&#xff1a;treeselect下拉…

数据结构和算法模块——队列(多例子+图文)

一文帮你看懂队列 什么是线性表为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;基本概念分类存储结构结构特点 队列为什么要学习队列&#xff1f;基本概念数据结构基本操作 待填坑 什么是线性表 为什么要学习线性表&#xff0c;它有什么用处和好处&#xff1f;…

【测试开发学习流程】MySQL函数运算(中)(下)

前言&#xff1a; 这些天还要搞毕业论文&#xff0c;东西少了点&#xff0c;大家将就看看QWQ 目录 1 MySQL的数据处理函数 1.1 文本处理函数 1.2 日期与时间函数 1.3 数值处理函数 1.4 系统函数 2 聚集运算 2.1 聚集函数 2.2 流程函数 1 MySQL的数据处理函数 MySQL支…

云手机在海外电商中的应用优势

随着海外市场的不断拓展&#xff0c;电商行业对于高效、安全的工具需求日益增长。在这一背景下&#xff0c;云手机作为一种新型服务&#xff0c;为海外电商提供了强大的支持和便利。云手机对传统物理手机起到了非常好的延展和补充作用&#xff0c;拓展了更广泛的应用场景&#…

windows管理github代码

资料 windows SSH下载github

【数字IC/FPGA】书籍推荐(0)----《Verilog 传奇--从电路出发的HDL代码设计》

在下这几年关于数字电路、Verilog、FPGA和IC方面的书前前后后都读了不少&#xff0c;发现了不少好书&#xff0c;也在一些废话书上浪费过时间。接下来会写一系列文章&#xff0c;把一部分读过的书做个测评&#xff0c;根据个人标准按十分制满分来打分并分享给大家。 定位 书名…

游戏反云手机检测方案

游戏风险环境&#xff0c;是指独立于原有设备或破坏设备原有系统的环境。常见的游戏风险环境有&#xff1a;云手机、虚拟机、虚拟框架、iOS越狱、安卓设备root等。 这类风险环境可以为游戏外挂、破解提供所需的高级别设备权限&#xff0c;当游戏处于这些风险环境下&#xff0c…

<深度学习初识>——《深度学习笔记》

深度学习笔记 一、人工智能简介 1.人工智能发展的重要时间节点 1.1人工智能孕育期 1.2人工智能诞生期 1.3人工智能第一次浪潮的发展 1.4人工智能的第一次寒冬 第一次寒冬主要面临的几个问题&#xff1a; 1.5人工智能第二次浪潮的发展 1.6人工智能的第二次寒冬 1.7人工智能第…

FREERTOS队列集和事件标志组

队列集 一个队列只允许任务间传递的消息为同一种数据类型&#xff0c;如果需要在任务间传递不同数据类型的消息时&#xff0c;那么就可以使用队列集&#xff01; 作用&#xff1a;用于对多个队列或信号量&#xff08;信号量本质上也是个队列&#xff09;进行“监听”&#xff…

python(Django)之登录功能实现

1、创建登陆函数 def login(request):if request.POST:username password username request.POST.get(username)password request.POST.get(password)user auth.authenticate(usernameusername, passwordpassword)if user is not None and user.is_active:auth.login(req…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台&#xff0c;推进医药企业数字化转型。随着科技的不断发展&#xff0c;数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具&#xff0c;正在逐步改变医药企业的生产方式和管理模式…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…