【Linux】进程(6):环境变量

大家好,我是苏貝,本篇博客带大家了解Linux进程(6):环境变量,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • (A)PATH
    • 方法1:将程序拷贝到PATH内容的路径下(不建议)
    • 方法2:将程序的当前路径添加到PATH中
  • (B)环境变量对应的配置文件
  • (C)更多的环境变量
    • 1.环境变量HOME:家目录所在的环境变量
    • 2.环境变量PWD
    • 3.环境变量SHELL
    • 4.环境变量HISTSIZE:记录的历史命令的个数
    • 5.env:查看所有的环境变量
  • (D)环境变量操作
  • (E)理解环境变量 系统
    • 1. 用代码拿到环境变量
    • 2. 环境变量再理解
    • 3. 本地变量

(A)PATH

我们知道,在命令行中输入的系统指令和我们自己写的程序最后都会成为进程,但为什么系统指令前面不需要绝对/相对路径,而我们自己写的程序需要呢?
在这里插入图片描述

因为在Linux中,存在一些全局的设置,它们告诉命令行解释器,应该去哪些路径下寻找可执行程序

下面以环境变量PATH为例

先打印环境变量PATH的内容
注意:PATH前要加$

在这里插入图片描述

PATH的内容中有很多路径,它们以: (冒号)作为分隔符

PATH中的路径有什么用呢?

  1. bash在执行命令的时候,需要先找到命令才能在未来将命令加载,那在哪找命令呢?如果命令前面没加绝对/相对路径,那么bash就会在PATH里的路径中查找,如果找到了,就加载;没找到,就会报错。
  2. 执行which命令时,which也是在PATH的路径里查找

现在,我想让我们自己写的程序和系统指令一样,前面不需要绝对/相对路径即可执行,有什么办法呢?有2种方法

方法1:将程序拷贝到PATH内容的路径下(不建议)

在这里插入图片描述

注意:此时需要用root管理员身份进行拷贝(直接转换成root身份或者sudo提权)(相当于将myprocess程序安装到Linux系统中)

我们非常不建议这种写法,所以现在我们将myprocess程序从/usr/bin路径下删除(相当于卸载程序)

当我们直接在命令行输入myprocess,bash报错,表明myprocess确实从/usr/bin路径下删除了

在这里插入图片描述

方法2:将程序的当前路径添加到PATH中

程序的当前路径为Linux_code/lesson_14,先直接将PATH赋值为Linux_code/lesson_14,所以PATH原先的内容完全被覆盖,只有Linux_code/lesson_14。此时再使用ls等系统命令就会报错,因为它们都在/usr/bin目录下,而/usr/bin不在环境变量PATH中

在这里插入图片描述

现在关掉该终端,重新打开一个终端,再来查看PATH的内容
在这里插入图片描述

我们发现,PATH的内容又变回原来的了,这是为什么?

系统中很多的配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存里)。最开始的环境变量不是在内存中,而是在系统的对应的配置文件中。当我们登录Linux系统时,环境变量对应的配置文件被加载到了bash进程中,所以默认我们查到的环境变量是内存级的,我们对环境变量PATH的修改也是在内存里修改,并不影响环境变量对应的配置文件。因此当我们关闭终端后,bash进程被杀掉,bash占据的内存空间被释放,再次打开终端,bash进程重新加载环境变量对应的配置文件,所以PATH的内容变回原来的了

虽然如此,但我还是不想在我们自己写的程序前面加绝对/相对路径,不能用我们上面的直接赋值的方法,怎么办?
PATH=$PATH: /home/zy/Linux_code/lesson_14,中间用: (冒号)分隔

在这里插入图片描述

下一个问题:我们能否将PATH的内容永久修改呢?可以,根据我们上面的解释,只需要修改对应的配置文件。那环境变量对应的配置文件在哪里?

(B)环境变量对应的配置文件

先将当前目录变成家目录(cd ~),再执行ls -al,列出家目录的所有文件的详细信息,包括以.开头的隐藏文件
在这里插入图片描述

找到.bash_profile和.bashrc文件,这就是环境变量对应的配置文件。打开2个文件

在这里插入图片描述

在这里插入图片描述

现在将myprocess当前路径加入到配置文件中PATH里即可

在这里插入图片描述
在这里插入图片描述

将配置文件修改回去

在这里插入图片描述

(C)更多的环境变量

1.环境变量HOME:家目录所在的环境变量

普通用户的家目录(以普通用户zy为例)是/home/zy,所以它的环境变量HOME=/home/zy
root的家目录是/root,所以它的环境变量HOME=/root
在这里插入图片描述

2.环境变量PWD

在这里插入图片描述

系统怎么知道我们当前在哪个目录下呢?
系统有个会变化的环境变量PWD,它会随着我们路径的变化,将当前路径动态地记录在PWD中

3.环境变量SHELL

shell是命令行解释器,常见的Shell工具包括:sh、bash、csh、tcsh、ash 等,所以我们怎么知道当前我们启动的是哪个呢?
在这里插入图片描述

所以我们的shell是bash

4.环境变量HISTSIZE:记录的历史命令的个数

在命令行中,我们可以通过按上下键翻到我们的历史命令,能上翻就表明我们曾经的命令是被Linux系统记录下来的,但系统不能一直记录吧,所以用HISTSIZE表示Linux系统能记录最新的多少个历史命令

在这里插入图片描述

我们可以用history命令来查看这1000条历史命令
在这里插入图片描述

5.env:查看所有的环境变量

在这里插入图片描述

HOSTNAME是主机名

在这里插入图片描述

(D)环境变量操作

在这里插入图片描述

env和echo之前有介绍过,这里不再赘述

export name=value:导出环境变量,环境变量名为name,值为value
现导出一个叫THIS_IS_MY_ENV的环境变量,值为hello

在这里插入图片描述

关掉终端后,环境变量THIS_IS_MY_ENV还存在吗?
不存在,因为这是在内存中导出了新的环境变量,并没有添加到对应的配置文件中

unset name:取消环境变量
在这里插入图片描述

本地变量

在这里插入图片描述

env查不到,所以asdf不是环境变量,但又能通过echo $查看内容,叫这样的为本地变量

(E)理解环境变量 系统

1. 用代码拿到环境变量

修改.c文件
在这里插入图片描述

先不要管environ是什么意思,我们目前只知道它的类型是char**。指向程序

在这里插入图片描述

我们发现,这就是我们的环境变量。在命令行参数中,我们讲过,父进程的数据,默认能被子进程看到并访问。对于./myprocess进程,其父进程是bash,且在Linux登录时,环境变量对应的配置文件被加载到了bash进程中,所以./myprocess进程能看到并访问bash的数据(环境变量)是可以理解的。

在这里插入图片描述

环境变量可是很多的,bash内部是如何组织的呢?
bash进程启动的时候,会从操作系统的配置文件中形成char* env[ ],它是一个指针数组,元素类型为char*,即元素指向某个字符或字符串。事实上,env数组的元素就指向环境变量,数组的最后一个元素指向NULL
在这里插入图片描述

你有没有发现,env数组和我们在命令行参数中讲的argv数组很像,都是指针数组,元素类型都是char*,最后一个元素都指向NULL…,所以main函数其实也可以有3个参数,分别是int argc,char* argv[ ]和char* env[ ]

因此main函数可以没有参数,也可以有2或3个参数

事实上,bash进程在启动的时候,默认会给子进程2张表:argv[ ]命令行参数表(用户从命令行中输入),env[ ]环境变量表(从OS的配置文件中来)。bash会通过各种方式将它们交给子进程

environ就是指向env数组
在这里插入图片描述

其实我们还可以用env数组来打印出环境变量
修改.c文件

在这里插入图片描述
在这里插入图片描述

上面的两种方法(char** environ和char* env[ ] )都是将环境变量全部打印出来,那如果我只想打印某个环境变量(如PATH),怎么办?

用getenv函数
先用man getenv命令查看getenv函数:头文件是<stdlib.h>,参数是环境变量名(如PATH),返回值类型是char*
在这里插入图片描述

修改.c文件
在这里插入图片描述
在这里插入图片描述

所以想要用代码打印环境变量,有3种方法
extern char** environ
通过main函数的参数:char* env[ ]
getenv函数

2. 环境变量再理解

环境变量具有系统级的全局属性

命令行中启动的程序,都会变成进程,且都是bash的子进程。那如果bash的子进程1再次fork形成子进程2,那子进程2能否看到bash的环境变量呢?

可以,因为环境变量具有系统级的全局属性,环境变量本身会被子进程继承下去。也就是说,如果将bash进程作为树的根节点,bash的子进程作为根节点的孩子节点,bash的子进程的子进程作为bash的子进程的孩子节点……,那么这整棵树都可以看见并访问bash进程的环境变量
在这里插入图片描述

内建命令:由bash亲自执行的命令

在Linux系统中,有80%的命令都是bash创建子进程执行的,如:ls,mkdir,cp等;也有一些是由bash亲自执行的命令,叫内建命令,如:export,echo

现在证明export是内建命令
先导出新的环境变量myval并赋值,在bash里面能找到myval

在这里插入图片描述

假如export是由bash创建子进程执行的,那么myval就不应该被bash看到,因为父进程不会看到被子进程修改的数据。所以export是内建命令

还能通过下面的方法证明:
先将环境变量PATH的内容置为空,而bash在执行普通命令时,需要先在PATH内容的路径下查找,只有找到了才能执行命令。现在PATH的内容为空,所以bash在PATH里没有找到ls,touch,cd等命令,所以这些命令都不能被执行。但是bash可以执行echo和export命令,因此它们是内建命令

在这里插入图片描述

3. 本地变量

本地变量只有在本bash内部才有效,无法被子进程继承下去。只有将本地变量导成环境变量,才能被子进程继承

证明:
新建一个本地变量AAA并赋值为111
在这里插入图片描述

上图表明本地变量AAA不被认为是环境变量,所以不在bash的env中。但AAA还是在bash内部的。同样能证明,echo是内建命令,否则它不能访问只在bash内部才有效的AAA

修改.c文件
在这里插入图片描述
在这里插入图片描述

执行程序后,path=NULL,所以子进程不能看见并访问bash的本地变量

将本地变量导出成环境变量
在这里插入图片描述

此时AAA既在bash的env中,也可以被子进程看见并访问


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

水经微图安卓版5.3.0发布

随时随地&#xff0c;微图一下&#xff01; 水经微图&#xff08;以下简称“微图”&#xff09;安卓版&#xff0c;新版已上线。 当前版本 当前版本号为&#xff1a;5.3.0-beta 如果你发现该版本中存在问题&#xff0c;请及时反馈给我们修订。 关于我们产品的版本控制&…

【面向就业的Liux基础】从入门到熟练,探索Linux的秘密(一)

主要帮助大家面向工作过程中Linux系统常用的命令联系&#xff0c;采用极致的实用主义&#xff0c;帮助大家节省时间。 文章目录 前言 一、linux系统 二、linux系统基本命令 1.Linux系统的目录结构 2. 常用命令介绍 3.命令演示 4.作业练习 总结 前言 主要帮助大家面向工作过程中…

微信小程序实现图生图(AI动漫特效)效果代码(触站API)

1.效果 触站AI图生图 2.本次用的是触站平台的API,我申请的适用积分,有水印(博主没钱)。如果需要没有水印的可以去买他们的资源包 3.首先我们需要去触站官网平台注册/登录账号(已注册可跳过该步骤) 4.开通API权限 我们可以在主页看到自己免费获取的500积分,用于接口调用…

微信小程序开发的详细解读

目录 小程序的ID 小程序的项目结构 小程序调试基础库 小程序调试 小程序配置文件 Pages配置 Windows配置 tabbar配置 页面配置 项目配置文件 sitemap文件配置 样式与组件 小程序常用组件 轮播图组件 图片组件 Text组件 跳转方式 滚动方式 字体图表使用 背景…

python入门3

文章目录 前言一、函数为什么要使用函数&#xff1f;函数定义函数定义和调用定义函数返回值定义空函数函数参数传递传递实参位置实参关键词实参默认值实参等效函数调用实参可选传递任意数量的实参任意数量关键字实参任意参数*与** 的区别使用元组和字典传参如果既有实参又有任意…

数据可视化---使用matplotlib绘制高级图表(2)

题目一&#xff1a;绘制人口金字塔图 编写程序。根据第8.6&#xff0c;绘制如下图的人口金字塔图。 运行代码&#xff1a; #绘制人口金字塔图 import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] SimHei plt.rcParams[…

云服务器安装宝塔Linux面板全流程,新手教程!

云服务器如何宝塔Linux面板&#xff1f;阿小云以阿里云服务器为例安装宝塔Linux面板全流程&#xff0c;非常简单&#xff1a; 使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云服务器网以CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器…

UML静态图-类图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段&#xff0c;帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构&#xff0c;包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 一、类图的表示法 类图(Cla…

轴承阀门5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

轴承阀门5G智能工厂工业物联数字孪生平台作为其中的佼佼者&#xff0c;以其高效、智能、灵活的特点&#xff0c;为制造业的数字化转型提供了强有力的支撑。数字孪生技术&#xff0c;作为智能制造的重要一环&#xff0c;通过构建虚拟与现实相结合的数字化模型&#xff0c;实现了…

离散数学答疑 1

全功能连接词组&#xff1a; 最小全功能联结词组&#xff1a; C&#xff1a;祈使句 6->8是叫条件转化&#xff08;置换&#xff09;吗 反证法&#xff1a; 结论取反作为条件&#xff0c;并且在推理过程中&#xff0c;既推出有B也有反B&#xff0c;则推理成功 反证法算是间…

轻松追剧不费力:短剧小程序引领观剧新潮流

随着时代的进步和科技的发展&#xff0c;人们的娱乐方式也在不断变化。如今&#xff0c;短视频、短剧等碎片化内容正逐渐成为人们日常生活中的一部分。而短剧小程序&#xff0c;以其便捷、高效、内容丰富的特点&#xff0c;正在引领一场观剧新潮流。 一、短剧小程序的崛起 在快…

能获取淘宝商品简化链接的浏览器书签

零&#xff0e;冗长的商品链接 访问网页版本淘宝时&#xff0c;浏览器的地址栏显示的链接太长就像这样(此链接非真实商品)&#xff1a; 于是使用如下方法 一&#xff0e;使用浏览器书签获取淘宝商品简化链接 1.新建书签 Chrome - 打开书签管理器(CtrlShiftO) - 左侧选择书签…

【python - 函数】

一、纯函数和非纯函数 纯函数&#xff08;Pure functions&#xff09;&#xff1a;函数有一些输入&#xff08;参数&#xff09;并返回一些输出&#xff08;调用返回结果&#xff09;。 >>> abs(-2) 2 可以将内置函数 abs 描述为接受输入并产生输出的小型机器。 ab…

C# Onnx E2Pose人体关键点检测

C# Onnx E2Pose人体关键点检测 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;inputimg tensor&#xff1a;Float[1, 3, 512, 512] --------------------------------------------------------------- Outputs ---…

电商API商品数据采集接口||助力电商企业采集商品大数据提高开发效率

提高开发效率&#xff1a;电商API接口允许不同的应用程序之间高效地进行交互&#xff0c;节省了大量的人力物力成本&#xff0c;使得开发者可以将更多时间和精力集中于自身的核心业务。 增加数据安全性&#xff1a;通过对数据进行安全加密&#xff0c;API接口实现了对数据的保护…

JVM参数配置

JVM参数的三种表示方法 在jvm中&#xff0c;jvm虚拟机参数有以下三种表示方法&#xff1a; 标准参数&#xff08;-&#xff09;所有的JVM实现都必须实现这些参数的功能&#xff0c;而且向后兼容非标准参数&#xff08;-X&#xff09;&#xff0c;默认jvm实现这些参数的功能&…

罗永浩创业史!普通人也能逆袭!2024轻资产创业项目!2024普通人的出路! 2024普通人做什么行业赚钱!

罗永浩出身草根&#xff0c;一路打拼至今&#xff0c;虽然屡屡受挫但是从未妥协&#xff0c;罗永浩真正的诠释了什么叫“彪悍的人生不需要解释”&#xff01; 回顾罗永浩的传奇创业史: 1. 从新东方出来做牛博网--失败 2.创办老罗英语培训学校--失败 3.致敬乔布斯做锤子科技-…

写一个盲盒模拟器

最近想写一个小程序&#xff0c;随便写一个玩吧&#xff0c;先想了下功能&#xff1a; 1.有很多盲盒&#xff0c;可以选择模拟开启 2.自定义盲盒&#xff0c;我们可以自定义制作盲盒自己玩 3.用户界面&#xff0c;记录盲盒历史&#xff0c;可以给坏越提意见 所用技术栈&…

django 旅游服务系统-计算机毕业设计源码88939

摘 要 旅游服务系统采用采用django框架、python语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、轮播图&#xff08;轮播图管理&#xff09;、公告信息管理&#xff08;公告信息&#xff09;、资源管理&…

开源模型应用落地-LangSmith试炼-入门初体验-监控和自动化(五)

一、前言 在许多应用程序中&#xff0c;特别是在大型语言模型(LLM)应用程序中&#xff0c;收集用户反馈以了解应用程序在实际场景中的表现是非常重要的。 LangSmith可以轻松地将用户反馈附加到跟踪数据中。通常最好提供一个简单的机制(如赞成和反对按钮)来收集用户对应用程序响…