由浅入深的了解进程(5)--环境变量

环境变量

  • 前言
  • 环境变量
    • 1、更多的环境变量及添加和删除
    • 2、整体理解环境变量系统
  • 3、内建命令

前言

在上一篇文章中简单的介绍了环境变量,但是没有讲述的比较全面了,所以现在再写一篇来介绍环境变量。

环境变量

在上一篇文章中,我们已经简单的学习了如何进行对于环境变量的修改并且能够知道环境变量在家目录的文件中修改才能够保证每一次的登录都是保存了我们自己添加的路径的。

1、更多的环境变量及添加和删除

env:查看所有的环境变量
echo $HOME:家目录的环境变量
echo $PWD:当前目录的环境变量
echo $SHELL:命令行解释器
echo $HISTSIZE:表示的是操作系统会记住用户最新的多少条指令

那我们能不能直接自己定义一个环境变量呢?

export THIS_IS_MY_PATH=(自己的地址)

在这里插入图片描述
此时的添加也是内存级别的,所以说重新登陆的话,就不能看到我们这次的操作了。
那导入有了,怎么删除?

unset THIS_IS_MYPATH:删除环境变量

如果不用export的话,直接设置的话,这就不算是环境变量,只能说是一个本地的变量。
在这里插入图片描述
当然这个如果是不是环境变量的话,怎么能够让本地的变量变为是环境变量呢?

//如果已经像上面的定义过本地变量的话,可以直接
export hello
//如果没有定义过本地变量的话,就像上文一样的操作就行了
export hello=helloqzy

2、整体理解环境变量系统

在这里插入图片描述


这就展示了,我们能够通过C/C++的代码的方式获得环境变量。所以根据上一章写过的在运行程序之前会有bash的命令执行的话,说明环境变量默认也是可以被子进程拿到的。环境变量默认存在的就是在bash内部(不过我们还没说能够被子进程修改从父进程那得到的数据)。
那环境变量的话在bash中是怎么管理的?
把环境变量存在指针数组之中!所以我们刚刚的程序能够得到所有的环境变量。此时的这个指针数组的最后一个位置也必须要是NULL。
所以现在bash进程启动的时候,默认会生成两个表,argv[]命令行参数表,env[]环境变量表,bash通过各种方式交予进程。
命令行参数表是用户在执行可执行文件输入命令行得到的,环境变量表是从OS的配置文件中得到的。
相信上面其中的environ二级指针的含义应该也是能够理解的了,因为environ中的每一个元素都得是一个字符串,但是C语言中没有string的含义,所以每个字符串,只能够用char*的指针来表示,那数组值中存储的每一个元素都是指针,那指向这个数组的指针的话,那也必须要用到二级指针了啊。要么就直接是指针数组直接表示这个环境变量表。
那我们除了这种方式能够实现环境变量的传入,那我们还能够怎么实现呢?其实第二种实现的的方式就是通过main函数传参,原理其实也相似于命令行参数的原理。
在这里插入图片描述在这里插入图片描述
环境变量本身具有系统级别的全局属性,因为环境变量本身能够被子进程继承下去。

getenv:单个获取环境变量的内容
//获取成功的话为非0,获取失败的话等于NULL

在这里插入图片描述
在这里插入图片描述
总结: 获得环境变量的三种方式。
1、extern char **environ
2、通过main函数参数
3、getenv(“path”)

可是我们上面使用的extern添加path的时候难道不也是bash下创建的一个子进程吗?那子进程的数据这么能够给到bash父进程呢?
因为export,echo的一些命令,这些命令叫做内建命令(80%的命令都是bash创建子进程进行的,但是剩下的一些就是由bash亲自进行的)。

3、内建命令

当我们在上一个,就是我们直接定义的话在这里插入图片描述
会出现这种情况。HELLO是本地的变量。如果我们写程序在程序中进行寻找的话也是不能够找到的,只能够通过echo来寻找。将本地的变量export的话,在env中才能够找到我们定义的环境变量,这说明什么,这说明我们定义的这个变量在一开始的时候一定是存在的,只不过不是存在环境变量中配置的,但是如果是只是加上export的话能够不变程序的情况下能够找到的话,这说明什么?这说明这个bash中一定是在原本就存储着我们定义的变量,只不过在使用export之后,bash的这个能够被继承到子进程之中,原本不能够继承。
所以本地变量只能在本bash中有效,不能被子进程继承下去。只有成为环境变量才能够被获取。
!!所以所以!!我们上一篇文章中介绍的echo不是bash的子进程而是内建命令,就能够很好的说明,echo能够直接读到本地变量。因为是不能够继承给子进程,说明内建命令就不是子进程,而是bash直接进行的。

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

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

相关文章

机械学习—零基础学习日志(高数18——无穷小与无穷大)

零基础为了学人工智能,真的开始复习高数 学习速度加快! 无穷小定义 这里可以记住,无穷小有一个特殊,那就是零。 零是最高阶的无穷小,且零是唯一一个常数无穷小。 张宇老师还是使用了超实数概念来讲解无穷小。其实是…

Mecanim Animation System

动画系统简介 Unity 有一个非常丰富而又复杂的动画系统,官方称其为Mecanim。该系统具有以下功能: 支持从外部导入动画剪辑,如:fbx、mb | ma(Autodesk maya 原件)、.max(3ds Max原件&#xff09…

Final Shell for Mac 虚拟机连接工具【简单易操作,轻松上手】【开发所需连接工具】

Mac分享吧 文章目录 效果一、下载软件二、安装软件三、运行测试安装完成!!! 效果 一、下载软件 下载软件 链接:http://www.macfxb.cn 二、安装软件 三、运行测试 安装完成!!!

Redis学习[6] ——Redis缓存设计

八、Redis缓存设计 8.1 为什么Redis用作缓存? 一般来说,数据库的数据都是落在磁盘上的,会导致读写速度很慢。如果用户的请求量非常大,数据库很容易崩溃。由于Redis的数据保存在内存中,读写速度很快,所以R…

React(四):DOCX文件在线预览

效果 注意 ⚠️注意:部分文件预览存在问题 依赖 $ yarn add docx-preview $ yarn add jszip源码 import ./index.scss; import {useRef} from react; import type {UploadRequestOption} from rc-upload/lib/interface; import {Upload, Button, message} from an…

【时时三省】(C语言基础)一维数组

山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 数组 数组就是一组数 数组的官方定义是一组相同类型元素的集合 一堆数组的创建和初始化 求组的创建 数组是一组相同类型元素的集合。数组的创建当时是: type_t arr&#x…

【过题记录】8.4(robocom补题,网络流)

今天robocom国赛,因为一个bool函数忘记return 1而裂开(错失21分) 以此为戒 贪心消消乐 其实就是一个求最大子矩阵和的板子题 利用最大子段和的思想 枚举矩阵中的上下界 压成一维后利用最大子段和 O ( n ) O(n) O(n)处理 复杂度 O ( n 3 ∗ k ) O(n^3*k) O(n3∗k) k为…

nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

今天 准备访问下Nginx服务,但是 启动时出现如下报错:(80端口被占用,没有找到nginx.pid文件) 解决思路: 1、 查看下排查下nginx服务 #确认下nginx状态 ps -ef|grep nginx systemctl status nginx#查看端口…

[CTF]-PWN:格式化字符串漏洞题综合解析

printf型格式化字符串漏洞: 任意地址写: 32位: 例题(inndy_echo): 有格式化字符串漏洞,可以修改printf的got表内地址为system,传参getshell 解法一: 在32位中可以使…

vscode的json文件解析

vscode的json文件解析 0.参考链接1.什么是JSON2.JSON语法2.0数据类型2.1对象2.2数组2.3嵌套 3.vscode包含的JSON文件介绍4.vscode包含的JSON文件解析4.1 task.json4.2 launch.json4.3 settings.json4.4 c_cpp_properties.json4.5 package.json(详细的看参考链接&…

Python设计模式 - 抽象工厂模式

定义 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 产品等级结构与产品族 为了更好地理解抽象工厂模式,先引入两个概念: 产品等级结构:就是产品的…

试用AWS全新神器:Amazon Bedrock的「Open Artifacts」版Claude.ai Artifacts

Claude.ai的Artifacts真是太方便了。 GitHub上的AWS Samples仓库中有一个仿制Artifacts的应用程序。 Open Artifacts for Amazon Bedrock https://github.com/aws-samples/open_artifacts_for_bedrockhttps://github.com/aws-samples/open_artifacts_for_bedrock本文将介绍「…

【C++】数组案例 五只小猪称体重

题目:给出五只小猪体重,找出最大的体重的值并打印 思路:利用数组写入五只小猪的体重,让每一个元素都赋值给一个整型变量并每赋值一次就于下一个数组中的元素比,若是大就继续赋值给这个变量,若是小则不赋值…

H81002S 1.7mm网络变压器:BMS汽车蓝牙接收器中的超薄共模电感科技

华强盛导读:在当今这个日新月异的汽车科技领域,每一处细节都蕴含着创新与突破。作为电动汽车心脏的电池管理系统(BMS),其高效稳定的运行不仅关乎续航与安全,更是智能化驾驶体验的基石。而在这背后&#xff…

win7安装mysql-installer-community-8.0.11.0

1、安装Microsoft Visual C 2019 Redistributable Package (x64) 官网下载地址:https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?viewmsvc-160#latest-microsoft-visual-c-redistributable-version 通过百度网盘分享的文件&#xff1…

Ubuntu安装nvidia-docker并使用的正确方式

Ubuntu安装docker: ubuntu(24.04)以及WSL2安装docker的详细教程_unbantu安装docker-CSDN博客文章浏览阅读646次,点赞5次,收藏3次。默认情况下,只有root用户和docker组的用户才能运行Docker命令。我们可以将当前用户添加到docker组,以避免每次使用Docker时都需要使用sudo。…

DAP-Seq:解锁转录因子结合位点的新钥匙

引言: 在基因组学的浩瀚宇宙中,转录因子如同掌管基因表达的神秘钥匙。它们与DNA上的特定序列结合,调控着生命活动的每一个节拍。然而,传统的研究方法在探索这些结合位点时面临诸多挑战。今天,我们将一起了解一种创新技…

多路I/O复用之select、poll、epoll

一、多进程/多线程模型的不足 为每个请求分配一个进程或线程的方式会带来较大的资源开销。创建和切换进程/线程需要消耗系统资源,包括内存、CPU 时间等。例如,在一个大规模的服务器环境中,如果同时有数千个请求到来,为每个请求创建…

01 LVS负载均衡群集

集群 在互联网应用中,随着站点对硬件的性能、响应速度、服务稳定性、数据可靠性等要求越来越高,单台服务器越来越力不从心 集群的含义 Cluster,集群也叫群集由多台主机构成,但对外只表现为一个整体 集群分类 类型 负载均衡集…

C++初学(10)

10.1、共用体 共用体是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。比如说:结构可以同时存储int、long、和double,而共用体只能存储int、long、或double。共用体的句式与结构相似,但含义不…