首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux——环境变量

Linux——环境变量

作者头像
Yui_
发布于 2024-10-16 00:54:32
发布于 2024-10-16 00:54:32
75600
代码可运行
举报
文章被收录于专栏:Yui编程知识Yui编程知识
运行总次数:0
代码可运行

当我们在Linux操作系统进行操作时,我们会发现使用系统命令的时候,像 cd ls pwd等等,通常不需要带对应的路径,只需要写对应的名字就可以了,而我们自己写的程序在运行时却必须要带上路径。这就和我们今天要学的环境变量中的 PATH有关了。

1.什么是环境变量

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

2.常见环境变量

  • PATH:指定命名的搜索路径
  • HOME:指定用户的主工作目录(及用户登录到Linux系统时,默认的目录)
  • SHELL:当前Shell,它的通常值是/bin/bash.

3. 如何查看环境变量

查看所有环境变量语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
env

演示:

环境变量
环境变量

查看特定的环境变量语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo $NAME //NAME为你环境变量的名称

查看PATH:

查看PATH
查看PATH

4. 测试PATH

先写一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main()
{
    printf("test PATH\n");
    return 0;
}
//形成的可执行文件为mybin

makefile:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mybin:test.c
	gcc -o mybin test.c
.PHONY:clean
clean:
	rm -f mybin

通过测试我们可以发现,当我们输入./mybin才可以运行这个代码,而直接输入mybin是无法运行的。 为什么我们的程序就必须带路径呢?有没有什么办法来改变这一情况? 当然可以!只要把我们的程序放入环境变量PATH中就可以了. 指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export PATH=$PATH:mybin所在的路径
添加环境变量
添加环境变量

5.测试HOME

在讲述Linux指令时,我们有提到过cd ~这个指令。它可以带我们回到家目录。当你用root用户和普通用户会到的家目录是不同的,这就与HOME有关了。

6. 和环境变量有关的指令

上文我们已经介绍了env和echo了,接下来再介绍3个相关的指令:

  1. export:设置一个新的环境变量。
  2. unset:清除环境变量。
  3. set:显示本地定义的shell变量和环境变量。

7.环境变量的组织方式

每个变量都会收到一张环境表,环境表是一个字符数组,每个指针指向一个亿\0结尾的环境字符串。

环境变量的组织方式
环境变量的组织方式

8. 通过代码获取环境变量

在一些书籍中,C语言的main话函数是有参数的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main(int argc,char* argv[],char* env[]){}

它们分别都是什么呢? 第一个参数argc:表示argv数组中存放的字符指针个数。 第二个参数argv:存储的是相关的字符指针,指针指向的是一个个字符串。 我们先来测试前两个吧。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main(int argc,char* argv[],char* env[])
{
    printf("argc = %d\n",argc);
    int i = 0;
    for(i = 0;argv[i];++i){
        printf("argv[%d] = %s\n",i,argv[i]);
    }
    printf("test PATH\n");
    return 0;
}
通过代码获取环境变量
通过代码获取环境变量

从实验的结果来看,argv数组的第一个指针指向的内容为可执行程序的文件名,第二个开始的指针指针指向的内容依次为加入后的选项,就是我们在命令行中输入的东西,因为我知道我们在命令行中输入的东西在运行可执行程序的时候,通过是路径+可执行程序,因此,一般情况下,argv中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次为命令行中输入的内容。

了解完这个特性后,我们就可以写一个在命令行实现的简单计算器了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[])
{
    if(argc!=4){
        printf("Usage: %s [-a -s -m -d] first_data second_data\n",argv[0]);
    }
    int a = atoi(argv[2]);
    int b = atoi(argv[3]);
    if(strcmp(argv[1] ,"-a") == 0){
        printf("%d+%d = %d\n",a,b,a+b);
    }
    else if(strcmp(argv[1],"-s") == 0){
        printf("%d-%d = %d\n",a,b,a-b);
    }
    else if(strcmp(argv[1],"-m") == 0){
        printf("%d*%d = %d\n",a,b,a*b);
    }
    else if(strcmp(argv[1],"-d") == 0){
        if(b == 0){
            printf("error!!!\n");return 0;
        }
        printf("%d/%d == %d\n",a,b,a/b);
    }
    return 0;
}
计算器
计算器

main函数的第3个参数

main函数的第3个参数叫做env,叫做环境变量。 下面我们来通过代码来看看环境变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

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

通过上面的实验我们可以看到,当执行程序的时候,会给main函数的第3个参数,我们可以直接在程序中遍历env的数组内容,然后将其打印在显示屏上,查看到系统中所有环境变量后,可通过echo $环境变量进行查看。

通过environ变量 environ是系统指定的一个变量,声明的时候要加上extern 创建一个项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main()
{
    extern char** environ;
    int i = 0;
    for(i = 0;environ[i];++i){
        printf("%s\n",environ[i]);
    }
    return 0;
}

运行结果:

运行结果
运行结果

通过我们的操作,可以看出environ与main函数的第3个参数类似。

getenv 通过man手册查看getenv

getenv
getenv

了解完用法后,我们在来写一个项目:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

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

9. 环境变量具有全局属性

环境变量可以被子进程继承下去,而普通变量是无法被子进程继承下去的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>

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

编译后查看:

查看
查看

没有任何结果,说明该环境变量不存在。

  • 导入环境变量export MYENV = "hello world"
  • 再次编译运行,发现结果有了,说明环境变量是可以被子进程继承下去的。
继承
继承

我们在系统中随便写一个程序,运行后我们会发现其父进程就是bash。bash是系统创建的一个进程,其可以派生出很多的子进程,系统中几乎所有进程的父进程都是bash,我们要知道的是环境变量是可以被bash派生出来的子进程给继承下去的,而普通变量就没有办法被继承。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux操作系统】环境变量和命令行参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
MicroFrank
2023/02/02
2.2K0
【Linux操作系统】环境变量和命令行参数
【Linux】进程理解与学习Ⅲ-环境变量
在学习之前我们要先搞清楚这个概念,就比如说【y=ab+cd】,在这里,等号左边的就是变量,等号右边的则是变量的内容。变量是bash中非常重要的一个存在,在Linux下变量又分为自定义变量以及环境变量。本次章节讲对此做相关理解。
诺诺的包包
2023/03/27
9770
【Linux】进程理解与学习Ⅲ-环境变量
【Linux】进程的优先级&&环境变量
上一篇在进程中提到了 【Linux】进程状态&&僵尸进程和孤儿进程&&阻塞、挂起和运行,这次来继续来谈进程。
zxctscl
2024/04/18
2410
【Linux】进程的优先级&&环境变量
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
1. 我们平常所用的Linux指令其实也是可执行程序,和我们自己写的二进制程序没什么两样,那么为什么在执行自己的程序的时候需要加上./,而执行这些系统提供的指令(可执行程序),不需要加上./呢?
举杯邀明月
2023/04/12
2.3K0
【Linux】Linux环境变量的理解 --- 命令行参数、shell子进程、环境变量、本地变量…
【Linux】进程详解:命令行参数、环境变量及地址空间
🌈之前在这篇文章中【Linux】进程管理:状态与优先级调度的深度分析就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的命令行参数以及环境变量和进程地址空间。
IsLand1314
2024/10/15
2650
【Linux】进程详解:命令行参数、环境变量及地址空间
【Linux系统#2】进程详解:命令行参数、环境变量及地址空间
🌈之前在这篇文章中【Linux】进程管理:状态与优先级调度的深度分析就已经简述了 进程的部分相关内容,下面我们来进一步深入了解进程的命令行参数以及环境变量和进程地址空间。
IsLand1314
2025/06/13
1660
【Linux系统#2】进程详解:命令行参数、环境变量及地址空间
【Linux修炼】9.环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
每天都要进步呀
2023/03/28
1.6K0
【Linux修炼】9.环境变量
Linux之环境变量
问题来了,为什么系统命令也是程序,但是执行它们时我们不需要带上路径,而我们自己的程序需要带上路径(例如:执行当前目录下的可执行文件test,需要用./test,'.'是当前路径的意思,因此是执行当前路径的文件test)。
摘星
2023/10/15
4120
Linux之环境变量
环境变量简介
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
羑悻的小杀马特.
2025/01/23
1450
环境变量简介
[Linux]环境变量
为了满足不同的运行场景,操作系统预先设置了一大批全局变量,这种可以指定操作系统运行环境的变量就是环境变量。
始终学不会
2023/04/07
1K0
[Linux]环境变量
【Linux】进程切换&&环境变量
有一名同学大一下学期,相应国家号召,决定去当兵。然后他找到自己的辅导员老师,和老师讲了自己的决定,然后老师就找到了他的关于他的档案和学期末的考试情况,然后打印成了两份,一份留到学校,另一份然这位同学拿走。等到当兵结束后,这位同学拿着自己的档案回到了学校,学校通过比对是这两份档案,证实这位同学就是这些学校的学生,然后这位同学回到校园,继续他的大学生活。
破晓的历程
2024/06/24
3490
【Linux】进程切换&&环境变量
优先级与环境变量的艺术:驾驭 Linux 系统的核心
在 Linux 系统中,进程和环境变量是操作系统的核心组成部分。进程优先级决定了资源分配的先后顺序,直接影响系统性能;而环境变量则提供了一种灵活的方式,用于传递系统配置信息以及控制程序的运行环境。本篇文章将深入探讨进程优先级的概念、调节方法及其原理,以及环境变量的定义、特性和实际应用,帮助读者更好地理解 Linux 系统的核心机制,从而在实际工作中更高效地调试和优化系统。
suye
2025/03/23
2490
优先级与环境变量的艺术:驾驭 Linux 系统的核心
Linux下的环境变量
绝活蛋炒饭
2024/12/16
2420
Linux下的环境变量
【Linux】环境变量
环境变量是操作系统用来存储和传递关于系统环境信息的一种机制,它相当于一种全局变量,可供系统中的各个程序、进程在运行时访问和使用,这些信息包括系统的配置参数、文件路径、用户设置等,程序可以根据这些环境变量的值来确定如何运行,例如在哪里查找文件、使用什么语言设置、分配多少内存等
s-little-monster
2025/02/07
8150
【Linux】环境变量
[操作系统] 环境变量详解
已知,所使用的指令就是可执行程序,但是在使用同一个指令的时候往往会附带不同的选项进行使用,得到的结果也不同。
DevKevin
2025/01/23
2670
[操作系统] 环境变量详解
【Linux】详谈命令行参数&&环境变量
我们的main函数正常来说是没有参数的,其实我们也可以给我们的main函数加上参数。main函数的第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型的指针数组(也叫命令行参数表),该指针数组以NULL结尾。当我们在命令行解释器输入一串指令时,命令行解释器会将这一串指令当成一个字符串,并以空格作为分隔符,将这个字符串分割成更小的字符串,并将这些更小的字符串分别存到argv数组中。main函数的argc和argv参数是由命令行解释器(通常是操作系统的shell/bash)维护的。当你从命令行运行一个程序时,命令行解释器会负责解析命令行中的各个部分,包括程序名(即argv[0])和传递给程序的任何选项(即argv[1]、argv[2]等)。解释器还会计算选项的数量,并将其作为argc的值传递给main函数。命令行解释器会负责将这些信息正确地传递给程序的main函数,以便程序能够使用它们。
用户10923276
2024/03/28
7230
【Linux】详谈命令行参数&&环境变量
【linux】环境变量
使用一个for循环遍历从0到argc-1的所有索引,argc 表示命令行传入的参数数量。
用户11029103
2024/10/16
6310
【linux】环境变量
【Linux篇】细品环境变量与地址空间
在编写c/c++代码时,main函数我们称为“我们自己的程序入口”,但main函数其实也是被其他函数调用的,在linux系统下是被一个叫statr()的函数调用。同时,main函数也是有参数的。
用户11456817
2025/06/11
680
【Linux篇】细品环境变量与地址空间
【Linux内核揭秘】深入理解命令行参数和环境变量
形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等等这些命令,都是用C语言写的可执行程序,所以必定会有main函数,我们以前学习C语言的时候也接触过一种main函数内部是传递参数的,学习C语言的时候,很难理解这些参数是什么意思,是因为这些参数是系统层面的,而不是语法层面的。 我们要理解命令行参数就需要先解决main函数的参数的问题。
用户11305458
2024/11/21
2320
【Linux内核揭秘】深入理解命令行参数和环境变量
环境变量与命令行参数详解
​ 我们将其运行编译并生成为可执行文件 myproc ,当我们要运行它的时候,都得在这个可执行文件前面加一个 ./ 这是为什么?
利刃大大
2023/04/12
1.5K0
环境变量与命令行参数详解
相关推荐
【Linux操作系统】环境变量和命令行参数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档