Linux 16 环境变量

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

目录

[深入理解 Linux 环境变量:从概念到实战应用](#深入理解 Linux 环境变量:从概念到实战应用)

一、什么是环境变量?

[二、Linux 中常见的环境变量](#二、Linux 中常见的环境变量)

快速验证

三、环境变量的常用操作命令

[1. 查看环境变量](#1. 查看环境变量)

[2. 设置与修改环境变量](#2. 设置与修改环境变量)

[3. 删除环境变量](#3. 删除环境变量)

四、通过代码操作环境变量

[1. 三种读取环境变量的方法](#1. 三种读取环境变量的方法)

[方法 1:利用 main 函数的第三个参数](#方法 1:利用 main 函数的第三个参数)

[方法 2:使用全局变量environ](#方法 2:使用全局变量environ)

[方法 3:使用系统调用getenv(推荐)](#方法 3:使用系统调用getenv(推荐))

[2. 设置环境变量:setenv函数](#2. 设置环境变量:setenv函数)

五、环境变量的核心特性:继承性

[步骤 1:编写父进程代码(parent.c)](#步骤 1:编写父进程代码(parent.c))

[步骤 2:编译运行](#步骤 2:编译运行)

运行结果

关键结论

六、实用技巧:让自定义程序无需./运行

[步骤 1:创建自定义程序](#步骤 1:创建自定义程序)

[步骤 2:编译并移动到自定义目录](#步骤 2:编译并移动到自定义目录)

[步骤 3:将目录添加到PATH(永久生效)](#步骤 3:将目录添加到PATH(永久生效))

[步骤 4:直接运行程序](#步骤 4:直接运行程序)

七、总结


深入理解 Linux 环境变量:从概念到实战应用

在 Linux 系统中,环境变量就像一个 "隐形的配置管家",默默为程序运行提供关键参数。你是否好奇过:为什么输入ls就能执行命令,而自己写的程序却要加./?为什么编译器能精准找到链接库,无需手动指定路径?这一切的背后,都离不开环境变量的功劳。今天我们就来揭开环境变量的神秘面纱,从基础概念到实战操作,带你全面掌握这一核心知识点。

一、什么是环境变量?

环境变量(Environment Variables)是操作系统中用来指定运行环境的动态参数集合,它本质上是 "键值对" 形式的字符串,为程序提供全局可访问的配置信息。

  • 核心作用 :统一程序运行环境,减少硬编码依赖。比如编译器通过PATH查找命令,通过LD_LIBRARY_PATH查找动态库,无需每次都指定完整路径。
  • 全局特性:环境变量具有继承性,父进程的环境变量会自动传递给子进程,这也是为什么终端中设置的环境变量能被后续运行的程序使用。
  • 常见应用场景:指定命令搜索路径、用户主目录、默认 Shell、语言编码等。

二、Linux 中常见的环境变量

Linux 系统预定义了许多常用环境变量,掌握它们能大幅提升操作效率:

环境变量 作用说明 示例值
PATH 命令搜索路径,用:分隔多个目录 /usr/bin:/bin:/usr/local/bin
HOME 当前用户的主工作目录 普通用户:/home/xxx,root:/root
SHELL 当前使用的 Shell 解释器 /bin/bash(默认)
USER 当前登录用户的用户名 xxx
LANG 系统语言和编码格式 zh_CN.UTF-8
LD_LIBRARY_PATH 动态链接库搜索路径 /usr/lib:/usr/local/lib

快速验证

在终端输入以下命令,查看这些变量的实际值:

bash

运行

复制代码
echo $PATH   # 查看命令搜索路径
echo $HOME   # 查看用户主目录
echo $SHELL  # 查看当前Shell

三、环境变量的常用操作命令

Linux 提供了一系列简单命令,用于查看、设置、修改环境变量,新手也能快速上手:

1. 查看环境变量

  • echo $NAME:查看指定环境变量的值(NAME为变量名)

    bash

    运行

    复制代码
    echo $USER  # 输出当前用户名
  • env:显示所有环境变量(仅环境变量,不含本地 Shell 变量)

  • set:显示所有变量(包括环境变量和本地 Shell 变量)

  • printenv:与env功能类似,支持指定变量名查询

    bash

    运行

    复制代码
    printenv PATH  # 效果等同于echo $PATH

2. 设置与修改环境变量

  • 临时设置(仅当前终端有效,关闭终端失效):

    bash

    运行

    复制代码
    # 格式:变量名=值(等号前后无空格)
    MYENV="hello linux"  # 定义本地Shell变量
    echo $MYENV          # 输出:hello linux
  • 导出为环境变量(子进程可继承,终端关闭失效):

    bash

    运行

    复制代码
    export MYENV="hello linux"  # 直接定义并导出
    # 或先定义本地变量,再导出
    MYENV="hello linux"
    export MYENV
  • 永久设置 (所有终端生效,重启系统仍有效):环境变量的配置文件分为用户级系统级,按需选择:

    • 用户级(仅当前用户生效):~/.bashrc~/.bash_profile
    • 系统级(所有用户生效):/etc/profile/etc/environment

    示例:在~/.bashrc中添加永久环境变量

    bash

    运行

    复制代码
    # 1. 编辑配置文件
    vim ~/.bashrc
    # 2. 在文件末尾添加以下内容
    export MYENV="hello linux"
    export PATH=$PATH:/home/xxx/mybin  # 将自定义程序目录加入PATH
    # 3. 使配置生效(无需重启终端)
    source ~/.bashrc

3. 删除环境变量

使用unset命令删除指定变量(包括环境变量和本地变量):

bash

运行

复制代码
unset MYENV  # 删除环境变量MYENV
echo $MYENV  # 输出为空,说明已删除

四、通过代码操作环境变量

除了终端命令,我们还可以通过 C 语言代码直接读取、设置环境变量,这在编程开发中非常实用。

1. 三种读取环境变量的方法

方法 1:利用 main 函数的第三个参数

main 函数的char *env[]参数本质是环境表指针数组,每个元素指向一个环境变量字符串:

c

运行

复制代码
#include <stdio.h>

int main(int argc, char *argv[], char *env[]) {
    int i = 0;
    // 遍历环境表,直到NULL结束
    while (env[i] != NULL) {
        printf("env[%d]: %s\n", i, env[i]);
        i++;
    }
    return 0;
}
方法 2:使用全局变量environ

libc 库定义了全局变量environ,直接指向环境表,使用时需用extern声明:

c

运行

复制代码
#include <stdio.h>

int main(int argc, char *argv[]) {
    extern char **environ;  // 声明全局环境变量表
    int i = 0;
    while (environ[i] != NULL) {
        printf("env[%d]: %s\n", i, environ[i]);
        i++;
    }
    return 0;
}
方法 3:使用系统调用getenv(推荐)

getenv函数可直接获取指定环境变量的值,简洁高效:

c

运行

复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 获取PATH环境变量的值
    char *path = getenv("PATH");
    if (path != NULL) {
        printf("PATH: %s\n", path);
    }
    // 获取自定义环境变量MYENV
    char *myenv = getenv("MYENV");
    if (myenv != NULL) {
        printf("MYENV: %s\n", myenv);
    } else {
        printf("MYENV未定义\n");
    }
    return 0;
}

2. 设置环境变量:setenv函数

c

运行

复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 设置环境变量MYENV,第三个参数1表示覆盖已有值
    setenv("MYENV", "hello from code", 1);
    printf("MYENV: %s\n", getenv("MYENV"));  // 输出:hello from code
    return 0;
}

五、环境变量的核心特性:继承性

环境变量的 "父子进程继承" 是其关键特性,也是实际开发中常用的配置传递方式。我们通过一个简单实验验证:

步骤 1:编写父进程代码(parent.c)

c

运行

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    // 设置环境变量并导出(子进程可继承)
    export MYENV="parent's env";
    // 创建子进程
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程:读取继承的环境变量
        char *env = getenv("MYENV");
        printf("子进程获取MYENV: %s\n", env);
    } else {
        printf("父进程设置MYENV: parent's env\n");
    }
    sleep(1);
    return 0;
}

步骤 2:编译运行

bash

运行

复制代码
gcc parent.c -o parent
./parent

运行结果

plaintext

复制代码
父进程设置MYENV: parent's env
子进程获取MYENV: parent's env

关键结论

  • 仅用MYENV="xxx"设置的是本地 Shell 变量,不会被子进程继承;
  • export MYENV="xxx"设置的是环境变量,会被子进程自动继承;
  • 环境变量的继承性让配置传递更简洁,比如在终端设置JAVA_HOME后,所有 Java 程序都能使用。

六、实用技巧:让自定义程序无需./运行

我们写的程序默认需要./程序名才能运行,原因是程序所在目录不在PATH环境变量中。通过修改PATH,可以像系统命令一样直接运行:

步骤 1:创建自定义程序

c

运行

复制代码
// hello.c
#include <stdio.h>
int main() {
    printf("Hello, 环境变量!\n");
    return 0;
}

步骤 2:编译并移动到自定义目录

bash

运行

复制代码
gcc hello.c -o hello
mkdir -p ~/mybin  # 创建自定义程序目录
mv hello ~/mybin/

步骤 3:将目录添加到PATH(永久生效)

bash

运行

复制代码
echo 'export PATH=$PATH:~/mybin' >> ~/.bashrc
source ~/.bashrc  # 生效配置

步骤 4:直接运行程序

bash

运行

复制代码
hello  # 无需./,直接运行
# 输出:Hello, 环境变量!

七、总结

环境变量是 Linux 系统的核心配置机制,它通过 "全局可访问 + 父子继承" 的特性,为程序运行提供了统一、灵活的环境支持。本文从概念、常用变量、命令操作、代码实战到实用技巧,全面覆盖了环境变量的关键知识点:

  1. 核心作用:指定运行环境、简化配置传递;
  2. 常用操作:echo查看、export设置、unset删除;
  3. 代码操作:getenv/setenv函数、environ全局变量;
  4. 实用场景:修改PATH简化程序运行、设置永久环境变量。
相关推荐
ZeroNews内网穿透2 小时前
关于飞牛fnOS重要安全更新的提醒
运维·服务器·web安全·ssh
流㶡2 小时前
mysql学习笔记之创建表、导入导出数据
数据库·mysql
横木沉2 小时前
Opencode启动时内置Bun段错误的解决笔记
人工智能·笔记·bun·vibecoding·opencode
cyforkk2 小时前
15、Java 基础硬核复习:File类与IO流的核心逻辑与面试考点
java·开发语言·面试
Monkey的自我迭代2 小时前
实战项目数据桥agent复盘
数据库·python·oracle
空空潍2 小时前
Python核心基础语法
开发语言·python
benjiangliu2 小时前
LINUX系统-09-程序地址空间
android·java·linux
霍理迪2 小时前
JS其他常用内置对象
开发语言·前端·javascript
若风的雨2 小时前
NCCL (NVIDIA Collective Communications Library) 中重要 API 的总结表
linux