当前位置: 首页 > article >正文

Linux——环境变量

文章目录

  • 1.什么是环境变量
  • 2.常见环境变量
  • 3. 如何查看环境变量
  • 4. 测试PATH
  • 5.测试HOME
  • 6. 和环境变量有关的指令
  • 7.环境变量的组织方式
  • 8. 通过代码获取环境变量
    • main函数的第3个参数
  • 9. 环境变量具有全局属性

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

1.什么是环境变量

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

2.常见环境变量

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

3. 如何查看环境变量

查看所有环境变量语法:

env

演示:
环境变量

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

echo $NAME //NAME为你环境变量的名称

查看PATH:
查看PATH

4. 测试PATH

先写一段代码:

#include <stdio.h>

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

makefile:

mybin:test.c
	gcc -o mybin test.c
.PHONY:clean
clean:
	rm -f mybin

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

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话函数是有参数的

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

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

#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中的第一个元素指向的字符串是路径+可执行程序名,后面的内容就依次为命令行中输入的内容。

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

#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,叫做环境变量。
下面我们来通过代码来看看环境变量:

#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
创建一个项目:

#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

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

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

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

getenv

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

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

#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派生出来的子进程给继承下去的,而普通变量就没有办法被继承。


http://www.kler.cn/news/331262.html

相关文章:

  • 获取unity中prefab的中文文本内容以及和prefab有关的问题
  • C++拾趣——绘制Console中圆形进度
  • Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
  • 查看 Git 对象存储中的内容
  • 【数据结构】图的最小生成树
  • C/C++ 中的未定义行为(Undefined Behavior, UB)
  • Win10之解决:设置静态IP后,为什么自动获取动态IP问题(七十八)
  • SSL VPN | Easyconnect下载安装使用 (详尽)
  • QT入门知识----2024.8.21-9.28
  • MongoDB快速实战与基本原理
  • 【LeetCode每日一题】——17.电话号码的字母组合
  • 【易上手快捷开发新框架技术】nicegui组件button用法庖丁解牛深度解读源代码IDE运行和调试通过截图为证
  • 深入理解 CSS 浮动(Float):详尽指南
  • B 私域模式升级:开源技术助力传统经销体系转型
  • C(十)for循环 --- 黑神话情景
  • R语言Shiny包新手教程
  • MongoDB伪分布式部署(mac M2)
  • Bilibili视频如何保存到本地
  • OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(一)
  • 基于微信小程序的校园失物招领系统的设计与实现(论文+源码)_kaic