【Linux】环境变量

发布于:2024-04-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

在这里插入图片描述

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


一、基本概念

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

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

二、Linux下常见的环境变量

2.1 PATH

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

在这里插入图片描述

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

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

请添加图片描述

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

请添加图片描述

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

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

2.2 HOME

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

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

echo $HOME

请添加图片描述

2.3 SHELL

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

echo $SHELL

请添加图片描述

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

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

env

请添加图片描述

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

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

请添加图片描述

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

请添加图片描述

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

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

int main(int argc, char *argv[]) 
{
    // 程序代码
    return 0;
}

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

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

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

请添加图片描述

【运行结果】

请添加图片描述

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

请添加图片描述

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

./my_program arg1 arg2 arg3 ...

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;
}

在这里插入图片描述

【运行结果】

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

再运行以上代码

在这里插入图片描述

五、添加环境变量

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

以修改环境变量PATH为例

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

方法一:重启Xshell

方法二:执行以下命令:

unset 环境变量

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

六、本地变量

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

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

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

variable_name=value

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

set

七、相关代码

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