linux设置环境变量_什么是linux环境变量

本来这篇文章好几天之前就写好了,但是媳妇儿跟我说工作日就不要发了,大家都在上班,哪有闲心思看你的文章。哎,可能大家用头条都是在放松刷娱乐,看小姐姐。所以就一直拖到现在。周末了,更是放松的好时候,葛优躺、刷小姐姐的时候别忘了来我这里学下linux。

上一篇文章《什么是linux命令》提到,linux在执行命令之前,其实是经由shell来处理的。Shell等待用户的终端输入,根据用户输入的命令名字,在环境变量PATH指定的路径下寻找和命令名字匹配的可执行文件,然后创建子进程,该子进程会被linux内核调度执行,在子进程中加载可执行文件并执行。这就是一条命令执行的一个完整过程。当然这里面涉及的细节,不是一两篇文章可以说的清楚的。后面我会在不同的文章中说明这些细节。shell作为用户和linux内核沟通的桥梁,可以认为shell是linux内核与用户沟通的默认官方代理人,有很多种不同版本的shell,最常见的是bash shell。所以当我们提到shell的时候,默认就是指的bash shell。如果你对这个代理人不满意,也可以更换代理人。你甚至可以把python解释器或者perl解释器作为linux的shell。不过几乎没有人会对bash shell不满意,也很少有人这么做。Bash作为linux的官方默认代理人已是历史约定。这么说只是让大家理解shell,它并没有那么神秘,和其他的脚本解释器,甚至我们敲的命令都是一样的,你可以在shell里再执行shell,像这样直接敲:bash,就会进入一个新的shell。至于怎么更换默认的shell,这不是这篇文章的内容。以后我会另外一篇文章说明怎么更换默认的shell。

我们回到本文的主题,上面提到shell是去环境变量PATH指定的路径中寻找命令,那么什么是环境变量呢?简单来讲,环境变量是用来设置linux应用程序运行环境的变量。我们经常接触的环境变量有PATH、HOME、HISTSIZE、HOSTNAME、PS1、PS2等。在shell命令行下可通过“echo $环境变量名”打印环境变量的值,也可通过env或者export命令查看系统中已有的环境变量。环境变量配置的是应用层的环境,由应用层程序设置并使用。不同的应用程序会关注不同的环境变量。比如很多时候PATH只会由shell关注,我们经常会配置的java环境变量,会由java虚拟机关注,其他的应用程序是不会关注的。如果你在命令行下只敲了cd,不带路径名,那么cd就会关注HOME这个环境变量,并切换到HOME环境变量指定的路径中,这个就是登录用户的家目录了。不过cd是shell的内置命令,所以HOME也主要是shell关注的。我最开始理解环境变量的时候,总是认为它们是内核的一部分,其实环境变量和内核没有多大的关系。环境变量并不是用来配置linux内核的。如果你想对linux内核进行配置,可以在内核编译配置阶段通过make menuconfig配置或者在内核运行过程中通过sysctl命令配置。

环境变量是用来配置应用程序运行环境的变量,所以环境变量是和应用程序息息相关的,而应用程序在运行阶段是以linux进程的形式存在的,每个进程都有自己的环境变量,那么这些环境变量存放在哪里呢?他们是从哪里来的呢?

这里我们需要从进程的虚拟地址空间布局着手。每个linux进程(shell也是一个linux进程)都有自己独立的进程虚拟地址空间,进程虚拟地址空间分为内核空间和用户空间,通常所有的linux进程虚拟地址空间的内核空间896M以内的空间会直接线性映射到物理内存的0-896M空间内。为什么是896M,这也是历史条件下形成的。剩下的虚拟地址空间内核会按照自己的分页机制,间接的映射到物理内存中。关于这部分内容就是linux内核的内存管理部分了,本文不作深入讨论。后面会专门抽出时间写一篇内存管理的文章。

说的环境变量,为什么会扯到进程虚拟地址空间呢?因为我们的环境变量是以环境变量表(数组)的形式存放在进程虚拟地址空间的用户空间里。这也是我上面说环境变量和内核没什么关系的原因。进程虚拟地址空间的布局图如下图所示:

fd44e1b25543823b47ce904dd6cf2f36.png

进程虚拟空间布局

这张进程虚拟内存布局图是本人所画的《linux内核原理大图》的局部。该图目前还在创作中,已完成大部分。关注本头条号,可随时关注本人最新文章。图中深红色的gap上方为内核空间,gap下方为用户空间。内核空间和用户空间有gap隔开。这也是内核的一种保护机制。这张内存布局图非常重要,在linux下学习c/c++编程的人应该对这张图比较熟悉,因为不管是c/c++还是linux内核,原理性的东西都是围绕着这张图展开的。这张图毫不夸张的说,就是打开linux 环境下c/c++基础编程的金钥匙。

在用户空间的最上部,stack和gap中间,就是环境变量表所存放的位置了。我们的进程如果要想获取环境变量或者设置环境变量,都是从这个内存区域获取和设置的。该部分会通过内核分页机制映射到物理内存中。

那么这里的环境变量又是从哪里来的呢?在《什么是linux命令》一文中,我们指出,linux运行一条命令,就会创建出一个进程,而这个进程是由shell创建的。也就是你在linux下执行的任何命令所创建的进程,都是shell的子进程。所以一个进程的环境变量,大部分都是从shell进程继承而来的。子又生孙,孙又生子,子子孙孙无穷尽也,而山不在高...

不好意思,我学的有点杂,我们回到主题。那么shell进程的环境变量又是从哪里来的呢?我们前面说过,shell作为linux内核与用户打交道的代理人,所以要面对各型各色的人,每个人都有不同的喜好。我们上文提到,可能会有人在小角落里密谋想要替换掉bash shell,Shell为了留住大家的心,适应不同人的喜好,就允许每个用户设置自己的环境变量。所以shell的环境变量其实就是用户你(你是主角,出场要带特效)自己设置的。所以我们经常说环境变量的时候,前面总是加上shell,叫shell环境变量。每次shell启动的时候,都会读取一系列的环境配置文件。将环境配置文件中环境变量的值读到自己内存空间的位置,也就是上图所说的位置啦。然后由shell生成的子进程就会继承shell的环境变量。那么shell(我们这里主要说的bash)的环境变量配置文件存放在哪里呢?有哪些设置环境变量的方法呢?我知道如果文章写的太长,就没有人会有耐心看下去的,所以我会在下一篇文章中说明shell环境变量的配置。因为平时还要养家糊口,我的出文速度有点慢,所以机智的你,在还没等到我的文章之前,就已经找到答案了。那么这篇文章也算起到抛砖引玉的作用了。

我们在知道一样东西的来龙去脉后,是不是学习起来就更加顺手了呢。当然还是那句话,你知道的越多,不知道的也越多。这边文章又挖了很多坑,欢迎关注本头条号,我们一起挖坑,一起填坑。本人水平有限,如果文章有误,欢迎批评指正。

f5e61ddfb947de063296c3d9dd15025a.png

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

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

相关文章

理科卷math·english·chinese·biology·chemistry·physics

一套比一套炸,果然我只会做B卷,虽然我B也很差但没差到这种地步 $math$ 题解 看似没法做但总会有突破口 $70\%$ 发现和小凯的诱惑很像,于是看$gcd$是否为$1$只要为$1$可以凑齐所有数 $n^2$枚举两两$gcd$ $80\%$ 我考试时思路 找到每一个数和$mod$的$gcd$,发现只要是任一$gcd$倍数…

cad卸载_怎么把CAD卸载干净,老司机来教你

CAD经常出现文件丢失啊、这样那样的提示,要是身边有个大神级朋友还好,没有的小盆友只能乖乖的卸载,重新安装了,那么又有个问题拦住我们了——怎么把CAD卸载干净呢?由于卸载不干净,再次安装CAD时&#xff0c…

什么是JavaServer Faces(JSF)–(第2部分)

Facelets声明语言 在第1部分中,我介绍了JavaServer Pages(JSF)背后的基本思想 。 在本文中,我想介绍Facelets声明语言 。 HTML标签 我们遇到的第一个标签是代表HTML元素HTML标签。 这些实际上只是HTML标记(例如输入&a…

问题 1076: 内部收益率

问题 1076: 内部收益率 时间限制: 1Sec 内存限制: 128MB 提交: 418 解决: 169 题目描述在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目…

路由器上的usb接口有什么用_路由器的USB接口,非常强大的功能,教您轻轻松松玩转,太实用了...

新一代出来的路由器后面基本上都会有一个或者是两个以上的有USB接口。居然还有很多人都不知道这些,要是比接口的用处。只是把它当做普通的无线路由器用。这样子太可惜了。其实路由器后面的usb接口呀,它有非常强大的功能,好处多多。接下来就请…

关于全局缓存的一种简单实现方法

缓存&#xff0c;在.Net系统开发中&#xff0c;经常使用到。如果&#xff0c;让你自己去实现&#xff0c;你会怎么做呢。 开始编码前思考&#xff1a; 1、肯定 是要 根据 key 去查询对应value&#xff0c;so 应该是List<KeyValuePair> 这类集合做缓存载体&#xff1b; 2、…

Lombok–您绝对应该尝试一下

Lombok在Java生态系统中并不是什么新鲜事物&#xff0c;但是我必须承认&#xff0c;直到我尝试使用它或被“确信”尝试它之前&#xff0c;我总是低估了它的价值。 我发现添加一个库来生成代码的价值并不高&#xff0c;这些库可以被当今的任何现代IDE轻松生成。 因此&#xff0c…

苹果手机透明桌面_原来苹果手机辨别真假这么简单!查看桌面1个图标,就能轻松分辨...

要说哪个品牌的手机贵&#xff0c;大家想到的肯定是苹果手机啦&#xff0c;所以说很多朋友都害怕自己买到假货。其实分辨苹果手机是不是正品很简单&#xff0c;只需学会这两个方法&#xff0c;就能辨别出手机的真假哦。一、从细节入手1.桌面时钟不知道大家发现没&#xff0c;iP…

NOIP模拟测试34「次芝麻·呵呵呵·长寿花」

次芝麻 题解 大力打表,发现快速幂, 例如初始$5$ $6$,那么第一次就是$5*2\%1110$,$6*2\%111$. 代码 #include<bits/stdc.h> using namespace std; #define ll long long ll n,m,k,d; ll g(ll x,ll k,ll s1){for(;k;k>>1,xx*x%d)if(k&1) ss*x%d;return s; } int …

Java Bean验证基础

这篇文章总结了一些简单易用的示例&#xff0c;这些示例说明了您想使用Java Beans Validation API&#xff08;JSR 349&#xff0c;JSR 303&#xff09;进行的最常见操作。 记住&#xff0c;Beans Validation独立于Java EE。 尽管它是作为Java EE兼容服务器的一部分内置的&…

NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

简单的区间 $update$ 终于$AC$了 找到$(sum[r]sum[l](sum表示以中间点为基准的sum)-mx)\%k0$的点 注意这里$sum$表示是以$mid$为基准点,(即$sum[l]$为后缀和,$sum[r]$为前缀和) 回忆$(sum[r]-sum[l])\%k0$这个经典问题做法(入阵曲简化版),开桶,桶里维护$sum[l]\%k$,那么$r$贡献…

苹果手机变卡了怎么解决_iOS 变卡怎么解决?一招搞定!无需刷机

iOSiOS 因为其优秀的底层交互逻辑&#xff0c;能让一部 iPhone 在不跨版本更新系统的前提下&#xff0c;至少保证 2 年内如新机般流畅。两年之后呢&#xff1f;你是否为手中的老将渐衰而苦恼过&#xff1f;本人对手机的流畅度十分敏感&#xff0c;可以说到了极致。付款时&#…

NOIP模拟测试38「金·斯诺·赤」

金 辗转相减见祖宗 高精 #include<bits/stdc.h> using namespace std; #define A 2000 #define P 1 #define N 10 #define ll long long ll n,T; char sjdfj[A]; struct bignum {ll n[A],l;bignum(){l1,memset(n,0,sizeof(n));}void clear(){while(l>1&&!n[l-…

什么是JSON处理(JSON-P API)?

Java EE中的JSON-P简介 JSON处理1.0&#xff08; JSR 353 &#xff09;的Java API是一个低级&#xff0c;轻量级的JSON解析器和生成器&#xff0c;它提供了在属性和值级别上操作JSON数据的能力。 JSR 353提供了两种JSON处理模型&#xff1a; 对象模型和流模型。 两种模型都可以…

电视机原理图_电工电气,如何看电气原理图和接线图,如何设计图纸?

电气图纸一般可分为两大类&#xff0c;一类为电力电气图&#xff0c;它主要是表述电能的传输、分配和转换&#xff0c;如电网电气图、电厂电气控制图等。另一类为电子电气图&#xff0c;它主要表述电子信息的传递、处理&#xff1b;如电视机电气原理图。本文主要谈电力电气图的…

NOIP模拟测试39,思维禁锢专场「工业题·玄学题·卡常题」

工业题 题解 抱歉,题解没时间写了 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define A 6666666 #define mod 998244353 ll jie[A],ni[A],acnt[A],bcnt[A]; ll fheng[A],fshu[A]; ll n,m,a,b; ll meng(ll x,ll k){ll ans1;for(;k;k>>…

ubuntu 如何登录远程服务器_VSCode远程登录云服务器、树莓派实现在线调试代码...

在PyCon2019大会上&#xff0c;微软发布了VSCode Remote&#xff0c;开启了远程开发的新时代&#xff01;Remote可以帮助开发者在容器、物理机器或虚拟机&#xff0c;以及WSL上实现无缝的远程开发。通过安装Remote Development Extension Pack&#xff0c;开发者可以快速上手远…

macosx jdk_MacOSX环境上的多个Java JDK

macosx jdk同样&#xff0c;这是在Mac&#xff08;OSX 10.8.x &#xff09;上配置Java开发环境的一个小技巧。 如果您现在真的开始&#xff0c;我建议您阅读我以前的文章之一 &#xff0c;这是一种快速干净的方法&#xff08;我想&#xff09;来设置环境变量并开始Java编码。 今…

屏幕方向读取与锁定:Screen Orientation API(转)

什么是 Screen Orientation API Screen Orientation API 为 Web 应用提供了读取设备当前屏幕方向、旋转角度、锁定旋转方向、获取方向改变事件的能力。使得特定应用在屏幕方向方面增强用户体验&#xff0c;如视频和游戏。该标准目前处于工作组草案状态&#xff0c;最近一个修改…

scenebuilder各控件属性介绍_Flutter 全栈式——基础控件

在Flutter中&#xff0c;UI小控件有两种设计风格&#xff0c;一种是Material设计&#xff0c;这是安卓的官方设计风格&#xff0c;另一种则是Cupertino风格&#xff0c;是iOS的官方设计风格。因此&#xff0c;当遇到带有这两个单词开头的控件时&#xff0c;我们应该明确他们表达…