Linux环境变量配置与std访问环境变量
文章目录
- 前言
- 1. 用户环境变量快速配置
- 1.2 **以上语句的具体解释:**
- 1.3 $PATHNAME实现增量式添加
- 2.系统级永久配置与避坑指南
- 2.1 特殊字符处理
- 2.2 动态PATH管理
- 2.3 敏感信息保护
- 2.4 环境调试命令
- 3. c++std中访问环境变量
前言
首先介绍一下Linux下各目录操作符的含义:
~/.bashrc-
~” :表示主目录,也就是当前登录用户的用户目录。
“/” :是指根目录:就是所有目录最顶层的目录。
“./” :表示当前目录,./ 一般需要和其他文件夹或者文件结合使用,指代当前目录下的东西。
“. .” :表示上级目录
“/.” :隐藏文件前会带.如.bashrc
作用域与类型
类型 | 生效范围 | 配置文件 | 生命周期 |
---|---|---|---|
临时变量 | 当前Shell会话 无 | (命令行设置) | 终端关闭失效 |
用户变量 | 单用户所有会话 | ~/.bashrc .zshrc | 用户登录加载 |
系统变量 | 所有用户 | /etc/environment | 系统重启生效 |
配置文件优先级与加载顺序
优先级 | 配置文件 | 加载场景 |
---|---|---|
1 | /etc/environment | 系统启动时最先加载 |
2 | /etc/profile | 用户登录时执行 |
3 | ~/.bash_profile | 用户登录Shell加载 |
4 | ~/.bashrc | 打开新终端时加载 |
getenv("MYSQL_CONF_PATH")
为获取指定环境变量的路径
1. 用户环境变量快速配置
- 利用vim进入~/.bashrc文档,摁住ctrl+g,直接跳到最后一行,摁一下i键,进入插入模式,现在可以编辑文档了。
- 跳到最后一个字符,摁一下换行,可以在下一行输入命令。
- 一般来说在Ubuntu的终端中,ctrl+shift+c是复制,Ctrl+shift+v是粘贴;
- 我们输入第一个环境变量配置:
export PATH=$PATH:/opt/Qt5.13.2/Tools/QtCreator/bin/
这条命令的含义为将/opt/Qt5.13.2/Tools/QtCreator/bin/
路径添加入PATH路径中
$PATH表示当前PATH的值,然后加上冒号和新的路径。冒号在Linux中用来分隔不同的路径。
所以整个命令的作用是将Qt Creator的bin目录添加到PATH中,这样用户就可以在终端直接运行Qt Creator的工具,而不需要输入完整路径。
PATH是一个重要的环境变量,系统用它来查找可执行文件。当用户在终端输入命令时,系统会按照PATH中的路径顺序搜索对应的可执行文件。
当在bash中输入qtcreator
指令时,系统会进行查找,最后去添加的环境变量下的路径里查找
此时路径下可以检测到qtcreator可执行文件即可执行
-
路径添加好了,该关闭~/.bashrc了,摁一下esc键,退出插入模式;
-
输入冒号:wq,关闭bashrc;
-
这时候还没有生效!需要source一下
source ~/.bashrc
此命令执行后配置立即生效 -
刚才配置的环境终于在这个终端生效了!
1.2 以上语句的具体解释:
-
export
表示要设置一个环境变量,且这个变量会被当前终端会话及其子进程继承。 -
PATH
是系统的环境变量,定义了可执行文件的搜索路径。当你在终端输入一个命令(如 ls 或 git)时,系统会按照 PATH 中列出的目录顺序查找对应的可执行文件。 -
$PATH
表示引用当前已存在的 PATH 值。例如,如果原本的 PATH 是 /usr/bin:/usr/local/bin,那么 $PATH 就代表这个字符串。 -
:/opt/Qt5.13.2/Tools/QtCreator/bin/
将新的路径追加到 PATH 中。冒号 : 是 Linux 中路径的分隔符,这里表示在现有路径的基础上,新增一个路径:/opt/Qt5.13.2/Tools/QtCreator/bin/。
最终效果:
执行命令后,系统会在原有路径的基础上,额外搜索 /opt/Qt5.13.2/Tools/QtCreator/bin/ 目录下的可执行文件。
例如,你可以直接在终端运行 qtcreator 命令(假设该目录下有 qtcreator 程序),而无需输入完整路径 /opt/Qt5.13.2/Tools/QtCreator/bin/qtcreator。
接下来是直接配置环境变量
只需要在.bashrc文件中填入如下语句:
export MYSQL_CONF=/home/kyros1ee/QtEnviroment/WeChat-main/chatserver/conf/mysql.conf# MYSQL_HOME
export MYSQL_HOME=/opt/module/mysql
export
后接自定义的环境变量名=路径即可引入需要的环境变量
可以使用echo $PATH
或其他环境变量名来检查环境变量是否添加成功:
1.3 $PATHNAME实现增量式添加
上面我们用了好几次这个美元符,这个符号是 什 么 意 思 呢 ? 直观的理解就是,直接调取当前环境变量的值 ,因此我们可以用这个PATH,来代替原本环境变量的路径,要是加东西的话,在前面或者后面加一个分号就行了~
利用$PATH在后面!增加!新的路径
export DEMOPATH="/xxx/xxx/xx1x/"
export DEMOPATH="$DEMOPATH:/xxx/xxx/xx2x/"
打印结果如下:
/xxx/xxx/xx1x/:/xxx/xxx/xx2x/
确实在后面,效果是先调用之前的1,再在后面加上2;
利用$PATH在前面!增加!新的路径
export DEMOPATH="/xxx/xxx/xx1x/"
export DEMOPATH="/xxx/xxx/xx2x/:$DEMOPATH"
打印结果如下:
/xxx/xxx/xx2x/:/xxx/xxx/xx1x/
2.系统级永久配置与避坑指南
(1) 全局配置文件
sudo vim /etc/profile
# 添加:
export LANG="en_US.UTF-8"
# 生效:重新登录或执行
source /etc/profile
(2) 模块化配置(推荐)
# 创建独立配置文件
sudo nano /etc/profile.d/myapp.sh
# 内容:
export API_ENV="production"
# 新终端自动加载
(3) 环境变量专用文件
sudo nano /etc/environment
# 直接写入(无需export):
DB_HOST="127.0.0.1"
2.1 特殊字符处理
# 含空格路径必须引号包裹
export DATA_DIR="/home/user/My Data" # 包含$符号需转义
export PWD="pa\$\$word"
2.2 动态PATH管理
# 安全追加PATH(防重复)
if [[ ":$PATH:" != *":/new/path:"* ]]; then export PATH="$PATH:/new/path"
fi # 数组形式管理(推荐)
path_array=( /usr/local/bin $HOME/.local/bin "${path_array[@]}"
)
export PATH=$(IFS=:; echo "${path_array[*]}")
2.3 敏感信息保护
# 创建私有配置文件(设置600权限)
chmod 600 ~/.env_secret
# 内容:
export DB_PASSWORD="s3cr3t!" # 按需加载
source ~/.env_secret
2.4 环境调试命令
printenv # 显示所有环境变量
env | grep PATH # 过滤特定变量
export -p # 查看已导出变量
3. c++std中访问环境变量
stdlib.h
中提供的接口
/* Execute the given line as a shell command.This function is a cancellation point and therefore not marked with__THROW. */
extern int system (const char *__command) __wur;
/* Return the value of envariable NAME, or NULL if it doesn't exist. */
extern char *getenv (const char *__name) __THROW __nonnull ((1)) __wur;#ifdef __USE_GNU
/* This function is similar to the above but returns NULL if theprograms is running with SUID or SGID enabled. */
extern char *secure_getenv (const char *__name)__THROW __nonnull ((1)) __wur;
#endif#if defined __USE_MISC || defined __USE_XOPEN
/* The SVID says this is in <stdio.h>, but this seems a better place. */
/* Put STRING, which is of the form "NAME=VALUE", in the environment.If there is no `=', remove NAME from the environment. */
extern int putenv (char *__string) __THROW __nonnull ((1));
#endif#ifdef __USE_XOPEN2K
/* Set NAME to VALUE in the environment.If REPLACE is nonzero, overwrite an existing value. */
extern int setenv (const char *__name, const char *__value, int __replace)__THROW __nonnull ((2));/* Remove the variable NAME from the environment. */
extern int unsetenv (const char *__name) __THROW __nonnull ((1));
#endif#ifdef __USE_MISC
/* The `clearenv' was planned to be added to POSIX.1 but probablynever made it. Nevertheless the POSIX.9 standard (POSIX bindingsfor Fortran 77) requires this function. */
extern int clearenv (void) __THROW;
#endif
接口提供的描述已足够清楚,这里放一个简单的例子
#include <stdlib>
int main()
{const char* configPath = getenv("MYSQL_CONF"); //if (!configPath){LOG_ERROR << " mysql.conf MYSQL_CONF_PATH not set!";return false;}ifstream file(configPath);if (!file.is_open()){LOG_ERROR << "mysql.conf 文件不存在!";return false;}
}
#include <stdlib>
#include <fstream>
#include <iostream>int main()
{std::system("ls -l >test.txt"); // 执行 UNIX 命令 "ls -l >test.txt"std::cout << std::ifstream("test.txt").rdbuf();
}