👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++和算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍
目录
一、基本概念
应用程序(如基本指令)的执行都需要运行环境,环境变量通常用于配置和控制应用程序的行为。
比如,学过java
的同学都知道,在Windows
下配置JDK
时需要设置环境变量,这是因为环境变量要告诉操作系统JDK
的安装路径。这样,当你在命令行中使用Java
开发工具(如javac
、java
)时,系统就能够找到这些工具的位置。没有正确设置环境变量,系统将无法定位JDK
,从而无法使用Java
开发工具。
二、Linux下常见的环境变量
2.1 PATH
不知道大家有没有注意到这样一个问题:在Linux
中,一切皆文件,那么基本指令也是可执行文件喽,那为什么它可以直接执行,而gcc/g++
编译出的可执行程序需要带路径./
?
猜也猜得到,./
是为了确定目标可执行文件在哪,既然不带路径就可以执行命令,那么说明系统自己能够找到可执行文件的位置!而系统就是通过环境变量PATH
(Linux
系统的指令搜索路径)来找到指令的位置。
- 查看环境变量的内容
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
的解释器有很多,如bash
、Zsh
、Fish
等,因此环境变量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;
}
其中,argc
和 argv
是 main
函数的参数,用于处理命令行参数。
argc
(argument count
):表示字符指针数组当中的有效元素个数。argv
(argument 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
获取
在上面的代码示例中,我们使用了本文件以外的变量
environ
,environ
变量通常是由操作系统或者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
七、相关代码
本篇博客代码链接:点击跳转