【Linux】环境变量

简介: 【Linux】环境变量

一、PATH 环境变量

1、什么是PATH环境变量

Linux 中的各种指令本质上是 /usr/bin/ 目录下的一个个可执行程序,和我们自己编写的可执行程序没有任何区别:

2020062310470442.png但是我们发现,执行我们自己的程序时需要指定路径,但是执行Linux中的各种指令却不需要指定路径:

2020062310470442.png

这是因为系统中存在PATH环境变量,PATH中存放着这些指令的地址;当我们使用这些指令时,系统会自动去PATH中寻找对应指令,如果找到了就执行,找不到就报错 – “command not found”。

2、如何添加PATH环境变量

我们可以使用 “echo $PATH” 来查看PATH环境变量中包含的内容:

2020062310470442.png

注:PATH 中不同路径之间用 : 分割。

我们也可以通过向PATH中添加内容来让我们自己的程序可以不需要指定路径就能被执行

法一:直接将程序添加到 /usr/bin/ 目录下 (不建议使用这种方法,因为我们写的程序没有经过测试,容易污染指令池)

2020062310470442.png

法二:使用 export 命令将当前可执行程序的路径导入到PATH中

2020062310470442.png

注:其中的 $PATH 代表之前PATH中内容,: 之后的为新添加的内容;注意不要直接 “export PATH=/home/thj/2022-11-13”,这样会把之前的PATH覆盖掉,使得Linux中的各种指令必须指定路径使用;同时,PATH中不能由空格,因为Linux中以空格为分隔符。

2020062310470442.png

学过Java的同学应该都知道,我们在最开始学习Java时需要在Windows中配置环境变量,其实其本质就是向PATH中添加内容 (Windows中的路径以分号分割)

2020062310470442.png

3、系统中的其他环境变量

PATH环境变量只是系统中众多环境变量的一种,除了PATH,我们还有许多其他环境变量,且不同的环境变量有不同的功能,也适用于不同的场景,比如:

    • HOSTNAME:主机名
    • USER:当前用户名
    • PWD:当前系统路径
    • HOME:当前用户的家目录
    • HISTSIZE:shell 能记忆的最多历史命令的条数

    2020062310470442.png

    我们可以使用 env 命令来查看系统中所有的环境变量:

    2020062310470442.png

    4、环境变量是怎么来的

    我们 “ls -al /home/thj” 可以发现家目录下存在两个隐藏文件 – .bash_profile 与 .bashrc:

    2020062310470442.png

    20200623104134875.png

    20200623104650275.png

    实际上,当我们在登录 shell 时,操作系统会让我们当前的 shell 进程执行 .bash_profile 中的内容,而 .bash_profile 又会调用执行 .bashrc,它们会将对应的环境变量导入到 shell 进程的上下文环境中。所以,如果我们上面不小心将 $PATH 覆盖掉了也不用担心,重新登录 shell 就好了。

    至此,环境变量的定义如下:

    环境变量是操作系统为了满足不同的应用场景,预先在系统内设置的一大批全局变量,这些变量往往具有特殊功能,且能够一直被 bash 以及 bash 的子进程访问

    注:环境变量具有全局属性的根本原因是环境变量会被子进程继承

    二、环境变量的基本操作

    1、设置环境变量

    Linux命令行其实是可以定义变量的,但是以这种方式定义出来的变量是本地变量,即只在 bash 进程中有效;而不是环境变量,因为环境变量具有全局属性:

    2020062310470442.png

    我们可以使用 export 直接定义环境变量,也可以使用它将已存在的本地变量导为环境变量:

    2020062310470442.png

    最后,我们可以使用 set 命令来查看所有变量,包括环境变量和本地变量;使用 unset 来取消变量,包括环境变量和本地变量:

    2020062310470442.png

    2、通过getenv获取环境变量

    我们可以使用 echo $环境变量名 来获取特定的环境变量,也可以通过 getenv() 函数来获取环境变量:

    2020062310470442.png

    其中 name 是我们要获取的环境变量的名称,如果获取成功就返回该环境变量的具体内容,失败就返回 null;

    有了 getenv 函数后,我们就可以自己编写系统中的某些指令了,比如 pwd:

    #include <stdio.h>
    #include <stdlib.h>
    #define MYPWD "PWD"
    int main()
    {
        char* env = getenv(MYPWD);
        printf("%s\n", env);
        return 0;
    }

    2020062310470442.png

    3、环境变量的意义

    我们上面提到,环境变量是操作系统为了满足不同的应用场景,预先在系统内设置的一大批全局变量;其中 PATH 是为了满足我们指令路径搜索的需求,而除了指令需求之外还有许多其他需求,其中非常重要的一个就是 身份认证

    我们以一个例子说明:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define USER "USER"
    int main()
    {
        char* who = getenv(USER);
        if(strcmp(who, "root") == 0)
        {
            printf("Operation success!\n");
        }
        else 
        {
            printf("Permission denied!\n");
        }
        return 0;
    }

    2020062310470442.png

    注:这里要使用 su -,而不能使用 su,因为 su - 会重新登录 shell,此时 shell 会重新加载环境变量,让 $USER 从 thj 变为 root;而 su 只是把用户身份切换为 root。

    2020062310470442.png

    我们可以在程序内部通过 getenv 函数来获取当前的Linux用户,然后判断其是否具备某种权限,再执行对应操作;

    另外,我们还可以通过 stat 来获取一个文件的其他属性,比如读写执行等,然后根据这些属性判断一个用户是否能对该文件进行操作:

    2020062310470442.png

    20200623104134875.png

    三、命令行参数

    我们上面提到,程序可以通过 getenv 函数来获取环境变量,其实除了 getenv 函数,程序还可以通过命令行参数传递来获取环境变量。

    学过C语言的同学应该都知道,main 函数其实是有参数的,且这些参数通过命令行传递:

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

    其中 argv 是一个指针数组,数组里面的每一个元素都指向一个字符串,argc 用来指定数组元素的个数;它们配合使用可以实现类似于 " ls -a -l -d" 选项的功能。


    而指针数组 env 就是用于接受父进程传递过来环境变量的参数,我们可以通过在 main 函数中打印 env 中的内容来验证它:

    #include <stdio.h>
    #include <stdlib.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;
    }

    2020062310470442.png

    程序也可以通过环境表 environ 来获取环境变量 – 环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串;每个进程都会收到一张环境表:

    2020062310470442.png

    20200623104134875.png

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    int main(int argc, char* argv[], char* env[])
    {
        extern char** environ;
        int i = 0;
        for(i=0; environ[i]; i++)
        {
            printf("%d:%s\n", i, environ[i]);
        }
        return 0;
    }

    2020062310470442.png

    相关文章
    |
    4月前
    |
    Linux Shell
    入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
    环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
    |
    7天前
    |
    存储 运维 Linux
    如何在 Linux 系统中使用 envsubst 命令替换环境变量?
    `envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
    17 4
    |
    4月前
    |
    Java Linux
    linux 对子用户配置java 环境变量
    linux 对子用户配置java 环境变量
    34 3
    |
    3月前
    |
    Linux Shell
    在Linux中,如何设置环境变量?
    在Linux中,如何设置环境变量?
    |
    3月前
    |
    Shell Linux
    在Linux中,什么是环境变量?如何设置和查看环境变量?
    在Linux中,什么是环境变量?如何设置和查看环境变量?
    |
    4月前
    |
    Linux
    Linux环境变量及作用
    Linux中的环境变量是系统配置参数,如HOME指示用户家目录,MAIL指邮件位置。`env`命令显示所有环境变量。系统有数百个变量,但了解关键的几个足够,如PATH、HOME、TERM等。环境变量由变量名和值组成,可自定义,如WORKDIR。局部变量需用`export`使其全局有效,以便其他用户使用。`su`命令用于切换用户,展示不同用户环境下变量值的差异。
    Linux环境变量及作用
    |
    4月前
    |
    Ubuntu Linux Shell
    Ubuntu/linux系统环境变量配置详解
    理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
    257 2
    |
    5月前
    |
    关系型数据库 MySQL Shell
    【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
    【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
    |
    5月前
    |
    Linux Shell 编译器
    Linux进程——Linux环境变量
    Linux进程——Linux环境变量
    40 3
    |
    4月前
    |
    Java Linux Shell
    【Linux】深度解剖环境变量
    【Linux】深度解剖环境变量
    36 0
    下一篇
    无影云桌面