• 【Linux】环境变量


    在这里插入图片描述

    👦个人主页:Weraphael
    ✍🏻作者简介:目前正在学习c++和算法
    ✈️专栏:Linux
    🐋 希望大家多多支持,咱一起进步!😁
    如果文章有啥瑕疵,希望大佬指点一二
    如果文章对你有帮助的话
    欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


    一、基本概念

    应用程序(如基本指令)的执行都需要运行环境,环境变量通常用于配置和控制应用程序的行为。

    比如,学过java的同学都知道,在Windows下配置JDK时需要设置环境变量,这是因为环境变量要告诉操作系统JDK的安装路径。这样,当你在命令行中使用Java开发工具(如javacjava)时,系统就能够找到这些工具的位置。没有正确设置环境变量,系统将无法定位JDK,从而无法使用Java开发工具。

    二、Linux下常见的环境变量

    2.1 PATH

    不知道大家有没有注意到这样一个问题:在Linux中,一切皆文件,那么基本指令也是可执行文件喽,那为什么它可以直接执行,而gcc/g++编译出的可执行程序需要带路径./?

    在这里插入图片描述

    猜也猜得到,./是为了确定目标可执行文件在哪,既然不带路径就可以执行命令,那么说明系统自己能够找到可执行文件的位置!而系统就是通过环境变量PATHLinux系统的指令搜索路径)来找到指令的位置

    • 查看环境变量的内容
    echo $环境变量
    
    • 1

    请添加图片描述

    从上图可以看到:环境变量PATH当中有多条路径,这些路径由:隔开。因此,当用户使用一个指令时,系统就会在环境变量PATH所提供的路径搜索,如果没有搜索到,那么就会报-bash: xxx: command not found

    请添加图片描述

    我们发现确实ls指令的路径确实在环境变量PATH中出现过。

    当然了,如果未来你不想自己用指定路径执行可执行文件,那么你可以将可执行文件所在路径添加到环境变量PATH中:点击跳转

    2.2 HOME

    HOME 代表了当前用户的家目录。这个环境变量存储了用户的家目录的路径。这样就是为什么,当用户登录系统或者执行cd ~时,系统会将用户的家目录设置为 HOME 环境变量指定的路径。

    你可以通过在终端中输入来查看当前用户的HOME环境变量的值。

    echo $HOME
    
    • 1

    请添加图片描述

    2.3 SHELL

    SHELL 是一个环境变量,它存储了当前用户的默认命令解释器shell的路径。在Linux系统中,每个用户登录时会启动一个shell进程,用于接受用户输入的命令并执行相应的操作。而shell的解释器有很多,如bashZshFish等,因此环境变量SHELL 指定了系统默认使用的shell

    echo $SHELL
    
    • 1

    请添加图片描述

    三、系统调用接口获取环境变量

    除了以上三个常见的环境变量以外,Linux中还有很多环境变量,可以使用以下命令搜索

    env
    
    • 1

    请添加图片描述

    除了env命令获取环境变量以外,我们还可以使用系统调用接口getenv()

    • 使用man手册查看getenv函数的用法
    man getenv
    
    • 1

    请添加图片描述

    比方使用getenv() 函数用于获取名为 PATH 的环境变量的值

    请添加图片描述

    四、代码获取环境变量(命令行参数)

    C/C++main函数其实是有参数的!只是我们平时不怎么使用参数,于是就将其省略了

    int main(int argc, char *argv[]) 
    {
        // 程序代码
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其中,argcargvmain 函数的参数,用于处理命令行参数。

    • argcargument count):表示字符指针数组当中的有效元素个数。
    • argvargument vector):是一个字符指针数组(向量表),数组以NULL指针结尾。

    首先很好奇的是,字符指针数组里面都有什么?我们可以来打印看看

    请添加图片描述

    【运行结果】

    请添加图片描述

    如果我在后面增加一些参数会如何呢?

    请添加图片描述

    因此,我们可以得出结论:字符指针数组argv存储的是命令行参数(包括程序名本身)。

    ./my_program arg1 arg2 arg3 ...
    
    • 1

    argv 数组将会包含以下内容:

    • argv[0]:指向程序名 ./my_program 的字符串。
    • argv[1]:指向 arg1 的字符串。
    • argv[2]:指向 arg2 的字符串。
    • argv[3]:指向 arg3 的字符串。

    最后一个元素 argv[argc] 将会是一个空指针(NULL),表示参数列表的结束。
    请添加图片描述

    那么这些命令行参数有什么用呢?

    • 命令行参数可以用来指定程序的行为和操作方式。例如,你可以通过命令行参数来控制程序的行为。这使得程序在运行时可以根据用户的需求进行不同的操作。就像基本指令可以带很多选项,呈现出不同的结果。

    请添加图片描述

    【运行结果】

    在这里插入图片描述

    但在Linux操作系统,main 函数还可以接收一个名为 env 的参数,即环境变量数组该数组的最后一个参数同样是NULL指针。

    int main(int argc, char *argv[], char *env[])
    {
        // ...
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    【运行结果】

    在这里插入图片描述

    如果你的环境的main不支持第三个参数,那你可以通过第三方变量environ获取

    在这里插入图片描述

    在上面的代码示例中,我们使用了本文件以外的变量environenviron 变量通常是由操作系统或者C库在程序启动时初始化的全局变量。在标准 C 库中,environ 的定义可能是在标准库头文件中,而不是在用户自己的代码中。因此,通过使用 extern 关键字,告诉编译器 environ 变量的存在,并且在链接时可以正确地找到它的定义。

    通过 env 参数,我们发现:程序(子进程)可以继承父进程(bash)的环境变量(环境变量一模一样),那么所有的程序本质上都继承bash的环境变量,因此环境变量具有全局属性

    这是可以验证的,比如我向bash添加一个环境变量,然后再运行以上代码,看看环境变量是否有继承bash添加的那个环境变量。

    export 环境变量name=值val: 设置一个新的环境变量
    
    • 1

    在这里插入图片描述

    再运行以上代码

    在这里插入图片描述

    五、添加环境变量

    • 在命令行中设置暂时环境变量

    以修改环境变量PATH为例

    # 如果不加$PATH:,那么你添加的路径会覆盖原有的路径
    export PATH=$PATH:你需要添加的路径
    
    • 1
    • 2
    • 永久设置环境变量
    # 1. 用vim打开.bashrc文件
    # .bashrc 文件通常存储用户自定义的shell配置信息
    vim ~/.bashrc
    # 2. 添加
    export PATH=$PATH:你需要添加的路径
    # 3. 执行以下命令让配置文件生效
    source ~/.bashrc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 清除临时的环境变量。

    方法一:重启Xshell

    方法二:执行以下命令:

    unset 环境变量
    
    • 1

    注:如果你是永久设置的环境变量,那么你需要再次进入配置文件~/.bashrc进行手动删除,最后再使用source ~/.bashrc让配置文件生效。

    六、本地变量

    Linux中,除了有环境变量,还有一个本地变量。

    只需要记住:本地变量不会被子进程继承,只会在bash内部有效,并且在该bash退出时销毁而环境变量具有全局属性。

    本地变量可以通过赋值给变量名来创建,语法如下:

    variable_name=value
    
    • 1

    如果要查看本地变量,你可以使用set命令来列出当前bash中定义的所有本地变量,包括环境变量

    set
    
    • 1

    七、相关代码

    本篇博客代码链接:点击跳转

  • 相关阅读:
    Radzen 2.70.6 update 2022-09-05
    Springboot毕设项目高校数字图书管理t1g8n(java+VUE+Mybatis+Maven+Mysql)
    基于51单片机的人体红外震动检测家庭防盗报警器
    Python3《机器学习实战》学习笔记(四):朴素贝叶斯实战篇之新浪新闻分类
    06.Octave的介绍、安装与简单使用
    火山引擎边缘云助力智能科技赋予生活更多新意
    为什么要选择AWS?AWS的优势有哪些?
    Hbase三大组件 -- Region Server、HMaster、Zookeeper 介绍
    回溯算法集合(全排列,组合,子集)
    java毕业生设计二手车交易市场网站计算机源码+系统+mysql+调试部署+lw
  • 原文地址:https://blog.csdn.net/Weraphael/article/details/138186270