Linux进程——Linux环境变量

news2024/11/20 9:26:24

前言:在结束完上一篇的命令行参数时,我们简单的了解了一下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=2004


printf("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.coloradmin.cn/o/1657159.html

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

相关文章

[性能优化] ScrollView视图优化为循环列表

问题描述&#xff1a; 原先商城的物品栏中的item 是load在一个scrollView 下&#xff0c;用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件&#xff0c;随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

YOLOv5,YOLOv7改进之结合​SOCA

1.SOCA moudle结构图 2,YOLOv5,YOLOv7改进之结合​SOCA 1.配置common.py文件 #SOCA moudle 单幅图像超分辨率 class Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.sha…

上位机图像处理和嵌入式模块部署(树莓派4b和c++新版本的问题)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 自己读书的时候是03年&#xff0c;学习c也是差不多04年开始&#xff0c;到现在基本上20年了。这20年过程当中&#xff0c;其实c的语言版本一直是在…

队列 (Queue)

今日励志语句&#xff1a;别总听悲伤的歌&#xff0c;别总想从前的事&#xff0c;别让过去拖住脚&#xff0c;别让未来被辜负。 前言&#xff1a;前面写了一篇 栈的实现&#xff0c;接下来学习一下它的"兄弟" 一、队列的概念&#xff1a; 队列&#xff1a; 也是数据…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

JavaScript百炼成仙自学笔记——13

函数七重关之六&#xff08;“new”一个函数&#xff09; 看个代码&#xff1a; function hello(){console.log(this); } 1、this&#xff1a;也是JavaScript中的一个关键字&#xff0c;永远指向当前函数的调用者 解释一下,有两层意思&#xff1a; ①this要嘛不出现&#…

从心理学角度看,GPT 对人有什么影响?

开启个性化AI体验&#xff1a;深入了解GPT的无限可能 导言 GPT 与我们日常生活的融合标志着技术进步的重大飞跃&#xff0c;为提高效率和创新提供了前所未有的机遇。然而&#xff0c;当我们与这些智能系统日益紧密地交织在一起时&#xff0c;探索它们对个人产生的细微的心理影响…

康姿百德集团公司官网价格统一,产品编码可查真伪售后有保障

康姿百德床垫&#xff0c;静音设计让你享受安静睡眠环境 随着越来越多的人睡眠质量差&#xff0c;夜间难以入睡&#xff0c;人们开始意识到睡眠问题已经不仅仅是健康问题&#xff0c;更上升为一种社会问题&#xff0c;急需得到解决。作为寝具行业中的优质品牌&#xff0c;康姿…

【Linux】如何定位客户端程序的问题

文章目录 1 客户端程序和服务端程序的差别2 问题类型2.1 崩溃(crash)2.2 CPU高2.3 内存高2.4 线程卡死 3 总结 1 客户端程序和服务端程序的差别 客户端程序是运行在终端上&#xff0c;通常都会与业务系统共存&#xff0c;而服务端程序通常会运行在单独的节点上&#xff0c;或者…

Leetcode—394. 字符串解码【中等】

2024每日刷题&#xff08;131&#xff09; Leetcode—394. 字符串解码 实现代码 class Solution { public:string decodeString(string s) {string curstr;int curNum 0;stack<pair<string, int>> st; for(char c: s) {if(isdigit(c)) {curNum curNum * 10 (c…

污水处理设备集中管理

在环境保护日益成为社会发展重中之重的今天&#xff0c;污水处理设备的有效管理显得尤为关键。传统的管理方式往往存在效率低下、响应不及时等问题&#xff0c;难以满足现代污水处理的需求。而HiWoo Cloud平台的污水处理设备集中管理系统&#xff0c;以其高效、智能的特点&…

python代码无法点击进入,如何破???

python代码无法点击进入&#xff0c;如何破&#xff1f;&#xff1f;&#xff1f; 举个栗子&#xff1a; model.chat是无法进入的&#xff0c;这时可以使用如下的命令进行操作&#xff1a; ?model.chat

Linux migrate_type进一步探索

文章接着上回Linux migrate_type初步探索 1、物理页面添加到buddy系统 我们都知道物理内存一开始是由memblock进行分配管理&#xff0c;后面会切换到buddy系统管理。那么接下来我们看一下&#xff0c;memblock管理的物理页面是怎么添加到buddy系统中的。 start_kernel() -&g…

【数据库原理及应用】期末复习汇总高校期末真题试卷06

试卷 一、选择题 1&#xff0e; ________是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 1&#xff0e; 有12个实体类型&#xff0c;并且它们之间存在15个不同的二元联系&#xff0c;其中4个是1:1联系类型&#xff0c;5…

Ubuntu22.04下安装kafka_2.12-2.6.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1. 将Kafka安装包移到下载目录中 2. 安装Kafka并确保hadoop用户对Kafka目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1. 启动Kafka 2. 测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro…

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

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

三勾软件 / 三勾点餐系统门店系统,java+springboot+vue3

项目介绍 三勾点餐系统基于javaspringbootelement-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 在…

科技云报道:从亚运到奥运,大型国际赛事共赴“云端”

科技云报道原创。 “广播电视转播技术拯救了奥运会”前奥委会主席萨马兰奇这句话广为流传。 奥运会、世界杯、亚运会这样的全球大型体育赛事不仅是体育竞技的盛宴&#xff0c;也是商业盛宴&#xff0c;还是技术与人文的融合秀。随着科技的进步&#xff0c;技术在体育赛事中扮…

当前主机使用的磁盘以及带宽情况

今日看到有用户在论坛留言反馈他买了Hostease Linux虚拟主机&#xff0c;想要查看当前主机使用的磁盘以及带宽情况&#xff0c;但是不知道如何查看。因为这边也是对于Hostease的虚拟主机产品是有所了解的&#xff0c;知道他们都是默认带管理面板的操做起来很方便的&#xff0c;…