Linux进程——Linux环境变量

前言:在结束完上一篇的命令行参数时,我们简单的了解了一下Linux中的环境变量PATH,而环境变量不只有PATH,关于更多环境变量的知识我们将在本篇展开!


在这里插入图片描述


本篇主要内容:
常见的环境变量
获取环境变量的三种方式
本地变量与环境变量
环境变量的配置文件
内建命令与常规命令

在这里插入图片描述


环境变量

  • 1. 初识环境变量
  • 2. 获取环境变量的方法
    • 2.1 方法一:getenv
    • 2.2 方法二:通过main函数
    • 2.3 方法三:全局变量environ
  • 3. 环境变量的配置文件
  • 4. 本地变量与环境变量
  • 5. 环境变量的全局性
  • 6. 内建命令与常规命令
  • 7. 总结

1. 初识环境变量

首先,我们先来了解一下什么是环境变量!

基本概念:

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 我们编写代码在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

而我们介绍几个比较常见的环境变量

常见环境变量:

  • PATH : 指定命令的搜索路径

  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

  • PWD : 记录当前路径,pwd就是调用了PWD环境变量

拓展:我们在登录xshell的时候系统其实会做以下操作:

  • 输入用户名,密码
  • 认证
  • 形成环境变量
  • 根据用户名,初始化HOME=/root,HOME=/home/…
  • cd $HOME

在Linux中环境变量有很多,我们可以使用指令来查看所有环境变量
指令:env

在这里插入图片描述
系统中会存在大量的环境变量,每一环境变量都有自己的用途来完成特定的功能!

2. 获取环境变量的方法

在Linux我们有很多种方法能够过去环境变量,这里我们简单介绍三种!

2.1 方法一:getenv

其实在Linux中我们有直接获取的函数:getenv()

在这里插入图片描述

我们来简单操作一遍:

  1 #include<stdio.h>2 #include<stdlib.h>3                                                                                                                                                                                        4 int main()5 {6     printf("PATH: %s\n",getenv("PATH"));7     return 0;8 }

在这里插入图片描述
这是最简单的一种获取环境变量的方式,让我们继续来介绍几种!


2.2 方法二:通过main函数

在我们查看环境变量时,其实他也是一个类似于命令行参数表的
在这里插入图片描述

系统在进行创建启动程序时,可以给进程(main)提供两张表:

  • 命令行参数表
  • 环境变量表

而这个环境变量表也是可以通过main函数来获取的

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

在这里插入图片描述

2.3 方法三:全局变量environ

最后要介绍的一种方法是全局变量environ

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

在这里插入图片描述


3. 环境变量的配置文件

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程bash给我们传递的!

当我们将PATH环境变量置为空串时:在这里插入图片描述
我们发现有很多的指令都用不了了,但当我们重新登录之后,又可以恢复正常!

其实:我们直接更改的是bash进程内部的环境变量信息!每一次重新登陆,都会给我们形成新的bash解释器并且新的bash解释器自动从读取形成自己的环境变量表信息!

而它的实质其实是每次重新登陆都会读取系统自带的配置文件.bash_profile,配置文件中的内容,为我们bash进程形成一张环境变量表信息!
在这里插入图片描述
如果我们想让我们的环境变量能够保存可以直接在配置文件中更改,下面会讲!


4. 本地变量与环境变量

Linux中,我们可以在bash中直接定义环境变量
指令:变量名=内容

在这里插入图片描述
但是当我们在环境变量表里获取我们自定义的变量时,是获取不了的。使用env也获取不了刚才定义的环境变量

实际上: 我们用户自己定义的环境变量是本地变量

在这里插入图片描述

如果想要我们定义的环境变量我们该怎么办,这时我们需要一条新的指令
指令:export 变量名

有了export我们就可以将我们自定义的环境变量添加到bash上下文的环境变量中
在这里插入图片描述
除了这种写法,我们还可以直接省略成一步。
在这里插入图片描述


我们用export指令可以将自己写的环境变量添加到父进程bash的进程上下文中,但是如果我们重新登录后,之前导入的变量是否还会存在?

  • 答案很明显,我们变量之会被添加到内存中,并不会改变配置文件,所以重新登录后并不会被保存
  • 因此如果我们想让我们的环境变量能够保存可以直接在配置文件中更改

在这里插入图片描述

在这里插入图片描述


5. 环境变量的全局性

环境变量的全局性能够被所有进程获取

让我们先来看看下面这段代码:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<sys/types.h>4 #include<unistd.h>5 6 int main()7 {8     pid_t id = fork();9     if(id == 0)10     {11         // 子进程12         extern char **environ;13         int i = 0;14         for(i = 0; environ[i]; i++)15         {16             printf("%d: %s\n", i, environ[i]);17         }18     }19     sleep(4);                                                                                                                                                                          20     return 0;21 }

我们在程序中直接创建子进程,然后让父进程什么也不做,来测试一下子进程能否获取父进程的父进程bash的环境变量?
在这里插入图片描述
那我们自定义的本地变量能不能被子进程继承呢?

OUR_ENV=2004printf("OUR_ENV: %s\n",getenv("OUR_ENV")); 

在这里插入图片描述

在了解完环境变量的全局性时,我们现在再来看看本地变量和环境变量的区别:

  • 本地变量只在bash进程内部有效,不会被子进程继承下去
  • 环境变量通过让所有的子进程继承的方式,实现自身的全局性!

6. 内建命令与常规命令

我们在之前就提到过,bash中的指令可以直接使用,不用加./是因为存在环境变量PATH,所以我PATH置空后,这些命令就会失效
在这里插入图片描述
但是我们置空PATH后,pwd依然可以正常使用,这是为什么呢?到了这里我们有得引出新的概念:

Linux的命令分类:

  • 常规命令,shell fork让子进程成执行的
  • 内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量!

我们虽然让PATH挂掉了,但是我们并没有让shell挂掉,因此shell内部定义的变量我们依然可以正常使用

注意:echo也是一个内建命令

7. 总结

本篇我们了解环境变量,让我们来回顾一下和环境变量相关的命令:

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

环境变量的学习重在理解,细节比较多,而且有很多新概念,所以认真,细心的学习环境变量是很重要的。

谢谢大家支持本篇到这里就结束了,让我们期待下一篇的进程地址空间
在这里插入图片描述

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

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

相关文章

新能源汽车动力电池热管理方案直冷方案原理简介

前言 随着新能源汽车的快速发展&#xff0c;动力电池作为其核心部件之一&#xff0c;对于其性能和寿命具有重要影响。动力电池在工作过程中会产生大量的热量&#xff0c;如果不能有效地进行热管理&#xff0c;将会导致电池温度升高、性能下降甚至损坏。因此&#xff0c;热管理…

力扣138. 随机链表的复制

Problem: 138. 随机链表的复制 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.创建Map集合Map<Node, Node> map;创建指针cur指向head&#xff1b; 2.遍历链表将cur作为键&#xff0c;new Node(cur.val)作为值&#xff0c;存入map集合&#xff1b; 3.再次…

C语言例题30:将一个正整数分解质因数

#include <stdio.h>void main() {int i;int x;printf("请输入一个正整数&#xff1a;");scanf("%d", &x);printf("%d ", x);//方法一&#xff1a;for (i 2; i < x; i) { //除数&#xff0c;从质数2开始while (x % i 0) { //能…

小程序如何注销

随着移动互联网的深入发展&#xff0c;管控也越来越严格。现在小程序都要求进行ICP备案&#xff0c;不管是新注册的还是以往注册的。很多商家的小程序本身处于无运营状态&#xff0c;现在要求备案&#xff0c;还不如直接注销。下面&#xff0c;将详细介绍小程序注销的步骤和注意…

挖掘线下潜力:Xinstall为App推广开辟新渠道

在移动互联网时代&#xff0c;App的推广成为了企业营销的重要环节。然而&#xff0c;线上推广渠道日益拥堵&#xff0c;成本不断攀升&#xff0c;让许多开发者开始寻找线下推广的新机会。此时&#xff0c;Xinstall作为国内专业的App全渠道统计服务商&#xff0c;为开发者提供了…

中国4月进口以美元计同比增长8.4%,出口同比增长1.5%

中国按美元计4月进出口同比增速均转负为正&#xff0c;双双超预期。 5月9日周四&#xff0c;海关总署公布数据显示&#xff0c;以美元计价&#xff0c;中国2024年4月进口同比增长8.4%至2201亿美元&#xff0c;前值同比下降1.9%&#xff0c;出口同比增长1.5%至2924.5亿美元&…

javaWeb快速部署到tomcat阿里云服务器

目录 准备 关闭防火墙 配置阿里云安全组 点击控制台 点击导航栏按钮 点击云服务器ECS 点击安全组 点击管理规则 点击手动添加 设置完成 配置web服务 使用yum安装heepd服务 启动httpd服务 查看信息 部署java通过Maven打包好的war包项目 Maven打包项目 上传项目 …

西汉两个韩信,结局怎么如此相似

西汉军事家、“汉初三杰”韩信是家喻户晓的人物&#xff0c;同时期还有一个韩信&#xff0c;也是战功赫赫&#xff0c;也被封王&#xff0c;史书为了区别&#xff0c;在后一个韩信名字之间加上一个“王”&#xff0c;称为韩王信。韩信是个光芒万丈的人物&#xff0c;韩王信也是…

WPF容器控件之WrapPanel、布局控件

WrapPanel: 换行panel 子元素进行换行&#xff0c;当子元素的宽度或者高度超出了父元素&#xff0c;才进行换行。高度超出父元素的高度 也会另起一列 属性 Orientation布局方式 实例 <WrapPanel Orientation"Horizontal"><Label>C# 是从 C/C 衍生出来的…

活动回顾 |观测云 AI Agent 探索实践

亚马逊云科技“构建全球化软件和互联网新生态——ISV 行业”论坛上&#xff0c;观测云产品架构师刘锐发表了题为“AI Agent 可观测性探索与实践”的主题演讲&#xff0c;不仅展示了观测云在人工智能领域的前沿技术&#xff0c;更强调了在日益复杂的系统环境中&#xff0c;实现有…

LeetCode738:单调递增的数字

题目描述 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 332 代码 class Solution { public:int monotoneIncreasingDigits(…

AI日报:干翻AI PC!苹果M4芯片首发;GoEnhance可生成粘土风格视频;DeepSeek-V2模型已在魔搭社区开源

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 1、干翻AI …

springboot利用切面保存操作日志(支持Spring表达式语言(简称SpEL))

springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09; 文章目录 springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09;前言一、Spring EL是什么&#xff1f…

Centos7安装java11

方法一&#xff1a;使用yum安装jdk环环境 查看云端yum库中目前支持安装的jdk软件包 yum search java|grep jdk选择版本安装jdk yum install java-11-openjdk.x86_64安装完成后验证 java -version

今天来聊聊Numpy (二)

​ 上一期和大家简短介绍了一下Numpy​&#xff0c;不知道你还记得惊喜嘛&#x1f440;。不知道的各位看官可以追溯一下上一期内容。&#xff08;别回来打小编就好&#x1f92a;&#x1f92a;&#xff09; ​ 今天来聊聊Numpy&#xff01;&#xff08;&#x1f448;上一期在…

26_Scala集合常用API汇总

文章目录 1.mkString2.size&#xff0c;length&#xff0c;isEmpty,contains3.reverse ,length,distinct4.获取数据相关4.1数据准备4.2准确获取尾部last4.3 除了最后一个元素不要其他都要4.4从集合获取部分数据 5.删除数据5.1删除3个从左边5.2删除3个右边 6.切分数据splitAt(n:…

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…

Kubernetes最小单元Pod的生命周期

1.1 Pod生命周期 1.1.1 过程及状态 Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分&#xff0c;它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明&#xff1a; Pod 创建过程&#xff1a;当一个 Pod 被创建时&#xff0c;Kubernetes 会…

chorme浏览器或者edge浏览器使用开发者模式

本篇文章主要讲解edge&#xff0c;因为它内核是chorme&#xff0c;还可以使用微软账号同步&#xff0c;谷歌翻译也凉凉了&#xff0c;edge还可以用翻译&#xff0c;推荐国内windows用户用它。 打开开发者模式 直接按F12点击右上角三个点...&#xff0c;点击更多工具&#xff…

Remix实现多语言

JS 中不同框架都有自己的多语言库&#xff0c;在 Remix 使用多语言&#xff0c;需要安装 remix-i18next 这个库。这个包是基于 i18next 开发的&#xff0c;使用方式可以到官网查看。 Remix-i18next 安装步骤如下&#xff1a; 安装依赖 npm install remix-i18next i18next rea…