【Linux】初识环境变量

news2024/12/29 9:40:41

文章目录

      • 环境变量引入
      • 初见环境变量
      • 和环境变量有关的指令
      • 如何通过代码获取环境变量
        • getenv()
        • main函数的命令行参数
        • 第三方变量environ
      • 程序变量可以继承给子进程

环境变量引入

Linux中有各种指令,

每个指令其实都是一个可执行程序:

image-20230131124007311

和我们自己写的C语言代码编译生成的可执行程序一样。

当我们在运行自己的可执行程序时需要加上路径./exe

其实就是为了让命令行解释器知道我们要去执行哪个程序,

但是当我们执行某条指令时却不需要加路径限制,

命令行解释器好像自己就能找到这条指令对应的可执行程序执行它。

而做到这一点其实就是因为环境变量的存在。


初见环境变量

对于上面提到的那种情况,其实是因为环境变量PATH的存在。

PATH是指定命令的搜索路径,

我们可以通过echo $PATH的形式来查看:

image-20230131124457725

可以看到PATH有好多路径,

不同路径间通过 冒号 “ : ” 分割,

可以看到红框框出来的就是此前man指令所在的目录。

当然环境变量还有很多,

比如我们使用pwd命令输出当前目录时,

pwd是一个可执行程序,与我们所在的那个目录没有任何关系,

它是怎么能实时知道我们在哪个目录的呢?

其实还存在一个名为PWD的环境变量:

image-20230131192149055

又或者使用指令cd ~会跳到用户所在目录,

可执行程序cd又是怎么知道我们的用户目录是哪呢?

其实还存在一个名为HOME的环境变量:

image-20230131192418037


和环境变量有关的指令

echo: 显示某个环境变量值

上面提到了,我们可以用echo $name的方式来输出一个环境变量的内容。

env : 显示所有环境变量

想看看所有的环境变量?env(environment variable)满足你:

image-20230131193443837

export : 设置一个新的环境变量

首先我们可以在命令行定义变量:

image-20230131193612437

但此时a只是一个本地变量,我们无法通过env命令查看到它

一个办法就是用export命令把a设成全局变量:

image-20230131201051841

当然,我们还可以用export来修改环境变量。

当前这个目录下面有一个输出hello world的可执行程序my_test

我们将my_test所在目录导入环境变量PATH中:

export PATH=$PATH:<路径>

这样运行my_test的时候就不用加路径了:

image-20230131201817636

但是这样做只是临时的,如果再开一个shell就不支持了,

因为这样定义的只是在当前命令行进程中定义的,

对其他命令行解释器没有影响。

当然,如果想创建一个自己的指令,

也可以将可执行程序拷贝到系统PATH指向的目录中。

unset: 清除环境变量

我们可以用unset + 变量名清除一个环境变量或本地变量:

image-20230131204145322

当然也可以把环境变量清除掉:

image-20230131204233418

如果不小心将PATH等系统提供的环境变量清掉了不要担心,重开就好了:

image-20230131204711251

set: 显示本地定义的shell变量和环境变量

我们可以用env打印所有环境变量,

同时也可以使用set打印所有的本地变量和环境变量:

image-20230131210728431


如何通过代码获取环境变量

getenv()

上面我们可以通过echo、env等方式从命令行获取环境变量,

我们可不可以通过自己写的程序获取环境变量呢?

和用系统调用接口getpid()获取进程的PID一样,

Linux同样提供了接口getenv()获取特定的环境变量:

image-20230131211756634

RETURN VALUE
       The getenv() function returns a pointer to the value in the environment, or NULL if there is no match.

description那儿提到了一个叫environment list的东西,

这其实是一个环境表,本质上就是一个字符指针数组,每个指针指向一个环境变量:

image-20230131212924939

这其实就是环境变量的组织方式,每个程序都会这样收到一张环境表。

下面就用一下试试:

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

int main()
{
    char* path = getenv("PATH");
    printf("path=%s\n", path);
    return 0;
}

image-20230131213754298


main函数的命令行参数

main函数其实也能有参数:

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

这三个参数叫做命令行参数。

下面对这三个命令行参数进行一一剖析。

首先argcargv是一块的。

可以看出argv是一个字符指针数组,它有几个元素呢,就是argc个。

当我们什么也不做时看看它都有什么内容?

image-20230131220250874

什么都不做时它只有一个信息,就是运行程序时使用的路径位置。

我们再试着运行test时加个命令行参数:

image-20230131220521748

所以为什么我们使用lsrm等命令时使用不同的命令行参数会有不同的运行效果,

这个小实验应该能给出我们答案。

下面再看第三个参数env

上面我们提到了,每个程序都会收到一张环境表,

也就是一个指针数组,env其实就是指向这张环境表的。

所以我们可以通过遍历env来获取所有的环境变量:

image-20230131221125112


第三方变量environ

当然,main函数可以用env来获取环境变量,

但还可以通过外部变量envrion来获取,它和env并无本质差别,

都是指向environment list的一个指针。

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明:

image-20230131222544325


程序变量可以继承给子进程

我们可以试着一个本地变量,并用export将它导成环境变量:

image-20230131224219201

然后我们试着在代码中用getenv()接口获取我们定义的环境变量:

image-20230131224621671

发现获取到了,这里可以说明一点,环境变量是可以继承给子进程的

为了加强验证这点,再看下面的现象:

image-20230131225148907

右边那个是新开的终端,结果就截然不同。

我们称左边的命令行为bash1,右边的命令行为bash2,

可以看出来,my_val是定义在bash1中的一个环境变量,

在bash2中并不存在。

在bash1中运行的进程test是bash1的子进程,

在bash2中运行的进程test是bash2的子进程,

而只有bash1的子进程拿到了my_val。

另外,我们重新定义my_val为本地变量,

试试命令行运行的子进程是否还能拿到:

image-20230131225518992

说明只有环境变量才可以被子进程继承,本地变量不可!

这样就有一个问题,按理来说echo也是bash的一个子进程,

那为什么echo就可以获取到本地变量呢?

Linux下大部分命令都是通过子进程的方式执行的。

但是,还有一部分命令,不通过子进程的方式执行,而是由bash自己执行,这种命令叫做内建命令,而echo就属于这种内建命令。

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

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

相关文章

API自动化测试【postman生成报告】

PostMan生成测试报告有两种&#xff1a; 1、控制台的模式 2、HTML的测试报告 使用到一个工具newman Node.js是前端的一个组件&#xff0c;主要可以使用它来开发异步的程序。 一、控制台的模式 1、安装node.js 双击node.js进行安装&#xff0c;安装成功后在控制台输入node…

Ansys Zemax | 多模光纤耦合

本文展示了利用几何图像分析特性来计算多模光纤耦合效率的方法。 还有使用IMAE操作数优化多模光纤耦合效率的方法。该方法只适用于包含大量模式的多模光纤。 下载 联系工作人员获取附件 简介 我们可以使用OpticStudio中的几何图像分析&#xff08;Geometric Image Analysi…

已解决error: legacy-instal1-failure

已解决&#xff08;pip install wxPython安装失败&#xff09;error: legacy-instal1-failure Encountered error while trying to install package.wxPython note: This is an issue with the package mentioned above&#xff0c;not pip. hint : See above for output from …

ChatGPT 回答什么是敏捷测试

Jenkins 官方文档&#xff1a;https://jenkins.io/doc/JUnit 插件文档&#xff1a;JUnit | Jenkins pluginTestNG 插件文档&#xff1a;https://plugins.jenkins.io/testng-plugin/Jenkins 教程&#xff1a;https://jenkins.io/doc/tutorials/JUnit 教程&#xff1a;JUnit 5 Us…

舆情监测软件报价方案,TOOM舆情监控软件多少钱?

舆情监测软件的价格因公司不同而有所差异&#xff0c;通常在几百元至数千元不等。价格还可能受到功能复杂度、数据量、使用时长等因素的影响。建议您联系多家软件开发商或销售代表&#xff0c;对比各家的产品和报价&#xff0c;以找到适合您需求和预算的解决方案。舆情监测软件…

算法训练营DAY46|139.单词拆分、多重背包的介绍

这一期到了背包问题的最后一期&#xff0c;主要讲解一道leetcodee题&#xff0c;和对多重背包的一些简单介绍&#xff0c;由于leetcode没有对于多重背包的具体问题&#xff0c;且面试基本不会问到多重背包所以只是作为科普。 139. 单词拆分 - 力扣&#xff08;LeetCode&#x…

缺省参数,函数重载,引用的使用(C++)

前言 本文主要讲解的是缺省参数&#xff0c;函数重载&#xff0c;引用的使用. 文章目录 目录 前言 一、缺省参数是什么&#xff1f; 1.缺省参数的分类 二、函数重载是什么&#xff1f; 三、引用是什么&#xff1f; 1.引用特性 总结 提示&#xff1a;以下是本篇文章正文内容&am…

java中的NIO,BIO,AIO

IO&#xff0c;input和output&#xff0c;Java 为 I/O 提供了强大的而灵活的支持&#xff0c;使其更广泛地应用到文件传输和网络编程中。 IO是什么&#xff1f;为什么需要IO&#xff1f; java在1.4之前&#xff0c;提供的是BIO&#xff0c;也就是java.io包下的的东西&#xf…

SpringBoot(二):配置文件的作用、配置文件的格式、properties配置文件、yml配置文件

目录一、配置文件的作用二、配置文件的格式三、properties配置文件3.1 properties的基本语法3.2 properties的缺点3.3 配置自定义内容3.4 读取配置文件四、yml配置文件4.1 yml基本介绍4.2 yml基本语法4.3 使用yml配置不同的数据类型4.4 读取yml配置文件4.5 在yml中配置对象4.6 …

关于UWB汽车钥匙介绍

汽车钥匙经历了机械钥匙、遥控钥匙、PEPS、数字钥匙四个阶段&#xff0c;而数字钥匙又分为BLE/NFC/UWB三种技术路线。由于UWB安全性、定位精度、作用范围明显好于BLE和NFC&#xff0c;因此成为汽车数字钥匙的最优技术。PEPS与数字钥匙PEPS是指无钥匙进入/无钥匙启动系统&#x…

MySQL详解(三)——高级 1.0

MySQL高级 utf8只支持每个字符最多三个字节&#xff0c;而真正的 UTF-8 是每个字符最多四个字节 MySQL 的这个bug一直没有被修复&#xff0c;他们在 2010 年发布了一个叫作“utf8mb4”的字符集&#xff0c;绕过了这个问题。 MySQL优点 Mysql是开源的Mysql是可以定制的&…

CDN的那些事

CDN的那些事一、前言二、基础配置三、访问控制四、缓存配置五、HTTPS配置六、高级配置&#xff08;最重点来了&#xff09;七、结语一、前言 大家好&#xff0c;我是尝试中成长的站长&#xff0c;前段时间&#xff0c;群友的cdn被刷爆了&#xff0c;这就引起了我的恐慌&#x…

读书笔记:神经网络加法层与乘法层的实现及应用 buy_apple_orange.py ← 斋藤康毅

“层”是神经网络中功能的单位。通常把神经网络的“层”实现为一个类。“层”的实现中有两个共通的方法 forward() 和 backward()。forward() 对应正向传播&#xff0c;backward() 对应反向传播。加法结点的反向传播将上游的值原封不动地输出到下游&#xff0c;乘法结点的反向传…

第2章:使用CSS定义样式

在前一章中,我们研究了Java代码的不同片段。 在本章中,我们将对每个示例使用相同的代码段: public void createPdf(String html, String dest) throws IOException {HtmlConverter.convertToPdf(html, new FileOutputStream(dest)); } 我们不看Java代码的不同片段,而是看…

数据分析-深度学习Pytorch Day13

单层感知机和多层感知机(MLP)是最基础的神经网络结构。将卷积操作创新的加入到神经网络结构形成了卷积神经网络&#xff0c;卷积神经网络给现代人工智能注入了活力。感知机网络和卷积网络(CNN)都属于前馈型网络(FeedForward Network)。单层感知机是二分类的线性分类模型&#x…

MT1010-M1016(java版)

MT1010输入和输出字符型数据难度&#xff1a;青铜0时间限制&#xff1a;1秒巴占用内存&#xff1a;64M★收藏△报错请编写一个简单程序&#xff0c;用户输入2个的字符型数据存储在变量中&#xff0c;并分别以字符形式和整数形式输出在屏幕上。格式输入格式&#xff1a;2个的字符…

Go语言DDD实战初级篇

导读 领域驱动设计(DDD)最简洁的描述可能是&#xff1a;如何在明确的限界上下文中创建通用语言的模型。通过 DDD思想设计开发的软件&#xff0c;在领域专家、开发者和软件本身之间不存在“翻译”&#xff0c;三者通过在限界上下文下的通用语言直接表示。而这个系列则是我们团队…

交换机——VLAN原理和基本配置

VLAN原理和配置VLAN的三种端口类型Access&#xff1a;接入链路类型&#xff08;一般使用&#xff1a;交换机与PC&#xff09;Trunk&#xff1a;干道链路类型&#xff08;一般使用&#xff1a;交换机与交换机&#xff09;Hybrid在这里&#xff0c;我们只使用和讲解Access和Trunk…

HTML简介

目录 一、HTML基础知识 二、HTML常见标签 注释标签 标题标签 段落标签 常用的转义字符 换行标签 格式化标签 图片标签 超链接标签 表格标签 列表标签 input标签 文本框 密码框 单选框 复选框 普通按钮 选择文件 下拉标签 多行文本输入 无语…

【哈希表】leetcode454.四数相加II(C/C++/Java/Python/Js)

leetcode454.四数相加II1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python版本3.5 JavaScript版本4 总结需要哈希的地方都能找到map的身影 1 题目 题源链接 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少…