【Linux】:环境变量

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux环境变量的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 环境变量  

1.1 基本概念

1.2 常见的环境变量

1.2.1 PATH 

1.2.2 PWD

1.2.3 HOME

1.2.4 查看全部环境变量

2. 获取环境变量

2.1 getenv接口

2.2 mian函数的第三个参数 

2.3 定义并导出环境变量

2.3.1 内存级别

2.3.2 更改环境变量脚本配置文件 

2.4 通过第三方变量environ获取 

3. 本地变量和环境变量

4. 与环境变量相关的指令


1. 环境变量  

一个可执行程序要能运行起来或者是一个指令要能跑起来,首先得找到这个可执行程序,我们在启动我们的可执行程序的时候,前面都要加上一个 ./ 在当前路径下查找这个可执行程序,我们在命令行中输入的指令它本质上也是可执行程序,那么为什么它不需要查找呢?

我们使用的指令也是经过查找的,只不过不需要我们自己手动查找,会存在默认的搜索路径,这些路径参数就是OS内部的环境变量。

1.1 基本概念

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

1.2 常见的环境变量

查看环境变量的指令:echo $NAME  //NAME:环境变量名称

1.2.1 PATH 

PATH : 指定命令的搜索路径

首先就是我们指令的默认搜索路径的环境变量:使用 echo $PATH 指令查看

  • 以 为分割符,分割的这些字串就是一个个的搜索路径;
  • 在执行我们的普通指令的时就会默认在这些路径下按照顺序搜索;

那么我们能否将我们的可执行程序的路径也添加进去呢? 

答案是可以的,只需要使用PATH=$PATH:路径(中间不能有空格)

同样的,将我们的可执行程序直接拷贝到这些搜索路径中,也是可以直接执行的,这种方法就叫做程序安装。

默认更改的环境变量是内存级别的(只限于本次登录)重新登录之后就会恢复默认。  

1.2.2 PWD

PWD:记录当前位于哪个目录下

在命令行中我们使用的pwd命令他是怎么知道我们当前位于哪个路径下的?

肯定是在这个指令中封装了查看PWD环境变量的一些调用,然后将该结果返回给我们。

1.2.3 HOME

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

在Linux中分为普通用户和超级用户,那么当普通用户刚刚登录进去时它所处的路径在/home/XXX下,超级用户在登录进去时在/root下,那么为什么两个用户的所在路径不一样呢?又是怎么做到的呢?

使用echo $HOME 查看该环境变量:

该环境变量刚好记录的就是普通用户和超级用户的主工作目录。

所以在我们登录的时候:

1. 输入用户名和密码

2. 认证

3. 形成环境变量(PATH、PWD、HOME......)

        3.1 根据用户名来初始化HOME=/root ro HOME=/home/XXX 

4. cd $HOME

1.2.4 查看全部环境变量

env指令:查看所有的环境变量

在系统中会存在大量的环境变量,每一个环境变量都有都有它特殊的用途,用来完成指定的系统功能!

2. 获取环境变量

获取环境变量一共有三种方法,接下来就一次介绍:

2.1 getenv接口

系统调用接口:getenv

传递所要获取的环境变量的名称,它的返回值就是环境变量的内容。

我们可以使用系统调用配合环境变量来指定的执行一些代码:比如只能让超级用户具有执行代码的权利:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char* name = getenv("USER");
    if(strcmp(name, "root") != 0)
    {
        printf("这是一个非法用户:%s\n", name);
        return 1;
    }

    printf("myself command!\n");
    printf("myself command!\n");
    printf("myself command!\n");
    printf("myself command!\n");
    return 0;
}

 

2.2 mian函数的第三个参数 

在上一章节的命令行参数中,说到main函数可以带两个参数,第一个参数是命令行输入的选项个数,第二个参数是该选项被分割的字串,那么在本章节,就要介绍main函数的第三个参数:

int main(int argc, char *argv[], char *env[])
{}

该参数是一个字符指针数组,里面保存的是字符串的地址。

当我们在命令行中使用env指令时会给我们打印出来所有的环境变量信息,那么这个信息是从哪里来的呢?

在Linux登录时会创建一张环境变量表,这张表的名字就叫做char *env[],这张表中每个下标位置都对应的是一个kv结构的环境变量,最终以NULL结尾。

系统启动时,可以给我们的进程(mian)提供两张表:

1. 命令行参数表

2. 环境变量表

可以使用main函数的第三个参数来查看环境变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[], char *env[])
{
    for(int i = 0; env[i]; i++)
    {
        printf("pid: %d, env[%d]: %s\n", getpid(), i, env[i]);
    }
    return 0;
}

 并且打印出来的环境变量信息和命令行使用env指令的信息一样。

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

那么父进程的环境变量信息又从哪里来?

当我们更改环境变量时,不小心改错了,那么没关系,只需要重新登录就可以恢复原来的环境变量,所以说我们更改环境变量信息默认更改的是bash进程内部的环境变量信息!每一次重新登录都会形成新的bash解释器,并且新的bash解释器会从指定位置中读取自己的环境变量表信息! 

环境变量信息是以脚本配置文件的形式存在的,这个配置文件在家目录下的.bash_profile文件:

所以在每一次登录的时候,bash都回读取.bash_profile配置文件中的内容为bash形成一张环境变量表信息,那么bash拿到了环境变量信息,就可以将环境变量信息传递给它的所有子进程。 

2.3 定义并导出环境变量

2.3.1 内存级别

在我们的命令行中可以直接定义一个环境变量:

MYENV_TEST1=helloLinux

MYENV_TEST2=helloWorld

然后使用export命令导出环境变量:

export MYENV_TEST1

export MYENV_TEST2

也可以直接定义+导出:

export MYENV_TEST1=helloLinux

export MYENV_TEST2=helloWorld

这样的配置是内存级别的,重新登录就不见了。

2.3.2 更改环境变量脚本配置文件 

直接在.bash_profile配置文件中添加环境变量

这样就做到了每次登录就会自动读取配置文件中的环境变量信息。

如果我们导出了一个环境变量, 那么这个环境变量信息可以被它的子进程全部读到的,所以我们说系统环境变量具有全局属性!

2.4 通过第三方变量environ获取 

#include <stdio.h>
int main()
{
    extern char **environ;  //第三方变量
    int i = 0;
    for (; environ[i]; i++)
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}

3. 本地变量和环境变量

在Linux的命令行中,我们可以直接定义本地变量:

可以看到定义本地变量时跟定义环境变量一样,只不过定义环境变量时需要使用export进行导出。

那么本地变量和环境变量有什么区别呢?

本地变量只在bash进程内部有效,不会被子进程继承下去。

环境变量通过让所有的子进程继承的方式,实现自身的全局性。 

我们都知道,在命令行中执行的命令也是一个子进程呀,那为什使用echo指令时还能看到bash定义的本地变量呢?

Linux中的指令分为两类:

1. 常规命令:shell通过fork之后让子进程执行的命令。

2. 内建命令:shell命令行的一个函数,使用时相当于函数调用。

echo命令就属于内建命令,所以可以看到bash定义的本地变量。 

4. 与环境变量相关的指令

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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

芒果YOLOv10改进122:注意力机制系列:最新结合即插即用CA(Coordinate attention) 注意力机制,CVPR 顶会助力分类检测涨点!

论文所提的Coordinate注意力很简单,可以灵活地插入到经典的移动网络中,而且几乎没有计算开销。大量实验表明,Coordinate注意力不仅有益于ImageNet分类,而且更有趣的是,它在下游任务(如目标检测和语义分割)中表现也很好。本文结合目标检测任务应用 应专栏读者的要求,写一…

深入学习 Kafka(2)- Partition 和 Topic

1. Partition的作用 Topic是逻辑的概念&#xff0c;Partition是物理的概念&#xff1a; Partition 对一个 Topic 的消息进行物理上的分离&#xff0c;让消息可以分布在不同的实体机器上&#xff0c;可以提升系统吞吐量和并行处理能力。每个Partition可以有多个副本&#xff08…

LinkedHashMap、TreeMap

LinkedHashMap&#xff1a; 有序、不重复、无索引&#xff0c;底层是双链表 TreeMap&#xff1a;底层基于红黑树&#xff0c;可以对键进行排序 默认排序&#xff1a;integer和string都是从小到大排序 例题&#xff1a;

农村程序员陈随易2024年中总结

今天是 2024年7月1日&#xff0c;时间如白驹过隙&#xff0c;今年已去其一半。 总结一下今年上半年的情况&#xff0c;给大家提供一些参考和建议。 希望大家关注一下公众号 陈随易&#xff0c;有些内容只在公众号发表。 先看看我的年初计划&#xff0c;这个在今年年初的时候&…

泛微E9开发 限制明细表列的值重复

限制明细表列的值重复 1、需求说明2、实现方法3、扩展知识点3.1 修改单个字段值&#xff08;不支持附件类型&#xff09;3.1.1 格式3.1.2 参数3.1.3 案例 3.2 获取明细行所有行标示3.2.1 格式3.2.2 参数说明 1、需求说明 限制明细表的“类型”字段&#xff0c;在同一个流程表单…

[Java基础揉碎]反射

目录 引出反射机制​编辑 介绍反射机制​编辑 反射的优点和缺点 (反射调用优化 )​编辑 Class类 class常用方法 ​编辑 ​编辑 获取class类对象的不同方式 哪些类型有class对象 ​编辑 类加载 ​编辑类加载流程图 类加载的五个阶段 ​编辑 通过反射获取类的结构信…

深入理解pytest fixture:提升测试的灵活性和可维护性!

在现代软件开发中&#xff0c;测试是保证代码质量的重要环节。pytest作为一个强大的测试框架&#xff0c;以其灵活的fixture系统脱颖而出。本文将详细介绍pytest中的fixture概念&#xff0c;通过具体案例展示其应用&#xff0c;并说明如何利用fixture提高测试的灵活性和可维护性…

HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。

业务中需要将用httpUtils请求返回的headers全部返回&#xff0c;塞到HttpServletResponse中&#xff0c;代码如下&#xff1a; HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…

FlinkX学习

FlinkX学习 FlinkX安装 由于flinkx已经改名chunjun 官网已不存在 (https://gitee.com/lugela/flinkx#flinkx)这里可以看到flinkx的操作文档 1、上传并解压 unzip flinkx-1.10.zip -d /usr/local/soft/2、配置环境变量 FLINKX_HOME/usr/local/soft/flinkx-1.10 export PATH$F…

基于Java实现图像浏览器的设计与实现

图像浏览器的设计与实现 前言一、需求分析选题意义应用意义功能需求关键技术系统用例图设计JPG系统用例图图片查看系统用例图 二、概要设计JPG.javaPicture.java 三、详细设计类图JPG.java UML类图picture.java UML类图 界面设计JPG.javapicture.java 四、源代码JPG.javapictur…

Eclipse 2024最新版本分享

一、软件介绍 Eclipse是一个开源的、基于Java的可扩展开发平台&#xff0c;最初由IBM公司开发&#xff0c;后于2001年贡献给开源社区&#xff0c;并由Eclipse基金会负责管理和开发。 如果在官网上下载比较慢&#xff0c;可以试试从云盘中下载&#xff0c;解压即可使用。 二、下…

免费开源的后端API服务-supabase安装和使用-简直是前端学习者福音

文章目录 它是什么安装和部署关于安装关于部署1、注册用户2、创建组织3、创建项目 创建数据库表&#xff08;填充内容&#xff09;填充数据库表 使用postman联调API 它是什么 一个开源免费的后端框架&#xff0c;firebase的替代品。可以简单理解类似于headless cms&#xff0c…

【Llama 2的使用方法】

Llama 2是Meta AI&#xff08;Facebook的母公司Meta的AI部门&#xff09;开发并开源的大型语言模型系列之一。Llama 2是在其前身Llama模型的基础上进行改进和扩展的&#xff0c;旨在提供更强大的自然语言处理能力和更广泛的应用场景。 以下是Llama 2的一些关键特性和更新点&am…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目录 一. 引言二. README2.1 项目目的2.2 构建和执行示例代码的步骤2.3 配置参数解释2.4 配置文件分析2.5 启动令牌初始化 三. 重点代码分析3.1 App文件夹3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夹3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…

js实现blockly后台解释器,可以单步执行,可以调用c/c++函数

实现原理 解析blockly语法树&#xff0c;使用js管理状态&#xff0c;实际使用lua执行&#xff0c;c/c函数调用使用lua调用c/c函数的能力 可以单行执行 已实现if功能 TODO for循环功能 函数功能 单步执行效果图 直接执行效果图 源代码 //0 暂停 1 单步执行 2 断点 //创建…

Lipschitz 连续,绝对连续

1. Lipschitz 连续 经常听到这个名词&#xff0c; Lipschitz 连续比普通连续更强&#xff0c;不仅要求函数连续&#xff0c;还要求函数的梯度小于一个正实数。 在单变量实数函数上的定义可以是&#xff1a; 对于定义域内任意两个 x 1 x_1 x1​ and x 2 x_2 x2​, 存在一个…

AI与EHS管理结合:融合创新,赋能绿色安全生产

随着科技的不断进步&#xff0c;人工智能AI已经在我们的日常生活中扮演了重要角色。在环保、健康和安全这个重要领域&#xff0c;也就是我们常说的EHS管理中&#xff0c;AI也正发挥着神奇的作用。 咱们知道&#xff0c;一个公司要想好好运转&#xff0c;确保工人安全、保护环境…

SpringBoot实现图片添加水印

提示&#xff1a;今日完成图片添加水印功能 后续可能还会继续完善这个功能 文章目录 目录 文章目录 前端部分 后端 Xml Controller层 Sercive层 Service实现层 Config配置层 application.properties 文件后缀名获取 常量定义 前端部分 <!DOCTYPE html> <htm…

NC13611 树(dfs序+区间dp)

链接 思路&#xff1a; 容易知道对于同一种颜色的子图一定是仅由该颜色的点连通的。设我们要划分的个数为x&#xff08;x<k&#xff09;&#xff0c;也就是说我们要选出x-1条边&#xff0c;这里有种情况。那么我们需要选出x种颜色&#xff0c;这里有种情况。然后我们需要将…

samba服务的搭建与使用

关闭selinux #暂时关闭selinux 查看selinux状态 [rootlocalhost ~]# getenforce Disabled [rootlocalhost ~]# 如果此处是‘enforcing’&#xff0c;则执行下列代码 [rootlocalhost ~]# setenforce 0 再次查看selinux状态 [rootlocalhost ~]# getenforce permissive #永久关…