Linux——环境变量

文章目录

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

1.什么是环境变量

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

2.常见环境变量

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

3. 如何查看环境变量

查看所有环境变量语法:

shell 复制代码
env

演示:

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

shell 复制代码
echo $NAME //NAME为你环境变量的名称

查看PATH:

4. 测试PATH

先写一段代码:

c 复制代码
#include <stdio.h>

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

makefile:

shell 复制代码
mybin:test.c
	gcc -o mybin test.c
.PHONY:clean
clean:
	rm -f mybin

通过测试我们可以发现,当我们输入./mybin才可以运行这个代码,而直接输入mybin是无法运行的。

为什么我们的程序就必须带路径呢?有没有什么办法来改变这一情况?

当然可以!只要把我们的程序放入环境变量PATH中就可以了.

指令:

shell 复制代码
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话函数是有参数的

c 复制代码
int main(int argc,char* argv[],char* env[]){}

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

我们先来测试前两个吧。

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

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

c 复制代码
#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,叫做环境变量。

下面我们来通过代码来看看环境变量:

c 复制代码
#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

创建一个项目:

c 复制代码
#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

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

c 复制代码
#include <stdio.h>
#include <stdlib.h>

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

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

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

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

相关推荐
杨云龙UP6 分钟前
小工具大体验:rlwrap加持下的Oracle/MySQL/SQL Server命令行交互
运维·服务器·数据库·sql·mysql·oracle·sqlserver
阿巴~阿巴~8 分钟前
使用 C 语言连接 MySQL 客户端(重点)
服务器·数据库·sql·mysql·ubuntu
白水先森16 分钟前
Python 字符串与布尔值详解
java·服务器·前端
is081520 分钟前
全志 H3 armbian 备份
linux·服务器·网络
初九之潜龙勿用23 分钟前
技术与情感交织的一生 (十四)
笔记·印象笔记
love530love27 分钟前
【笔记】 Podman Desktop 中部署 Stable Diffusion WebUI (GPU 支持)
人工智能·windows·笔记·python·容器·stable diffusion·podman
Olrookie35 分钟前
若依前后端分离版学习笔记(十九)——导入,导出实现流程及图片,文件组件
前端·vue.js·笔记
初圣魔门首席弟子36 分钟前
C++ STL string(字符串)学习笔记
c++·笔记·学习
CS_Zero1 小时前
【开发工具】Windows10&11远程Ubuntu18及以上桌面
笔记·ubuntu
LGL6030A1 小时前
数据结构学习(2)——多功能链表的实现(C语言)
数据结构·学习·链表