当前位置: 首页 > news >正文

09.Linux环境变量

环境变量基本概念

什么是环境变量?

首先要考虑为什么咱们自己写的指令需要./命令呢?就是因为系统并不知道程序在哪里,如果想要让自己写的程序可以直接执行,就要把程序拷贝到 /usr/bin目录下,这样系统就可以找到然后直接运行。
环境变量是 操作系统中用于配置系统行为的一组动态值。它们像是系统的“设置项”,可以影响程序的运行方式。

在 Linux 中,环境变量通常是一些 键值对,比如:

PATH=/usr/local/bin:/usr/bin:/bin

这表示变量 PATH 的值是多个路径组成的列表,用冒号分隔。


环境变量的作用

环境变量可以:

  • ✅ 控制程序的默认行为(比如语言、路径)
  • ✅ 传递配置信息给 shell 或其他程序
  • ✅ 设置用户级别或系统级别的参数

常见环境变量举例

变量名作用
PATH告诉系统去哪些目录查找可执行文件
HOME当前用户的主目录路径
USER当前登录的用户名
SHELL当前使用的 shell 类型(如 bash)
LANG系统语言设置
PWD当前工作目录

查看环境变量的方法

echo $PATH

测试HOME(这个可以标识当前是谁在使用Linux)

在这里插入图片描述
可以观察到在修该权限之后,HOME这个键值也发生了改变

环境变量相关的命令

命令作用说明示例
echo显示某个环境变量的值echo $PATH 显示路径变量
export设置一个新的环境变量,并使其对子进程可见export MY_VAR="hello"
env显示当前所有环境变量env
unset清除某个环境变量unset MY_VAR
set显示所有 shell 变量(包括环境变量和本地变量)set

🧠 小提示:

  • export 是让变量“走出当前 shell”,对子进程有效。
  • set 显示的内容比 env 更全面,包括函数定义和本地变量。
  • unset 删除变量后,echo $变量名 会输出空值。

对于这句话:“export 是让变量走出当前 shell,对子进程有效”,我想再来讲一讲


🧠 什么是 shell 和子进程?

在 Linux 中:

  • shell 是你当前操作的命令行环境,比如 bash。
  • 当你运行一个程序(比如 lspythonvim),shell 会创建一个新的 子进程 来执行它(大多数情况下,执行一个命令确实会创建一个新的子进程)。

🧪 举个例子:变量不 export 会怎样?

MY_VAR="hello"
bash
echo $MY_VAR

在这里插入图片描述

解释:

  • 第一行:你在当前 shell 设置了变量 MY_VAR
  • 第二行:你打开了一个新的 shell(子进程)。
  • 第三行:你尝试在子进程中读取 MY_VAR

👉 结果是:什么都不会输出,因为这个变量没有“走出去”。


✅ 使用 export 后的效果

export MY_VAR="hello"
bash
echo $MY_VAR

👉 这次你会看到输出:hello

为什么?

  • export 把变量放进了环境变量表中。
  • 子进程启动时会继承这个环境变量表。
  • 所以子进程也能访问这个变量。

🔍 总结

情况子进程能否访问变量?
MY_VAR="hello"❌ 不可以
export MY_VAR="hello"✅ 可以

man函数的三个参数

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc, int* argv[])
{for(int i=0;i<argc;i++){printf("argc[%d]-> %s\n",i,argv[i]);}return 0;
}

在终端输入命令之后会发现这样的输出

./mycmd -a -b -c

在这里插入图片描述
所以我们可以知道argc保存了我们输入字符串的个数,argv是一个指针数组,我们输入的字符串都会被解析然后进行存储。
接下来我们一起看看env参数

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc, int* argv[], char* env[])
{for(int a=0; env[a]; a++){printf("env[%d]->%s\n",a,env[a]);}return 0;
}

在执行程序之后会看到这样的输出
在这里插入图片描述
在 CentOS(或任何 Linux 系统)中,获取环境变量的方式主要有三种。

🧪 方式一:使用 echo 命令

这是最直接的方式,用于查看某个环境变量的值。

✅ 示例代码:

echo $PATH
echo $HOME
echo $USER

📘 说明:

  • $PATH:显示系统查找命令的路径列表
  • $HOME:当前用户的主目录
  • $USER:当前登录的用户名

🧪 方式二:使用 printenvenv 命令

这两个命令可以列出当前所有环境变量,也可以查看某个指定变量。

✅ 示例代码:

printenv           # 显示所有环境变量
printenv PATH      # 查看 PATH 变量
env                # 也可以显示所有环境变量

📘 说明:

  • printenvenv 的输出格式是 KEY=VALUE
  • 适合用于脚本或调试环境配置

🧪 方式三:使用 getenv() 函数(在 C/C++ 程序中)

如果你在写 C 或 C++ 程序,可以用 getenv() 来获取环境变量。

✅ 示例代码(C语言):

#include <stdio.h>
#include <stdlib.h>int main() {char* path = getenv("PATH");if (path != NULL) {printf("PATH = %s\n", path);} else {printf("PATH not found.\n");}return 0;
}

✅ 总结表格

方法使用场景示例命令或代码
echo查看单个变量echo $PATH
printenv / env查看所有或指定变量printenv, env, printenv HOME
getenv()在 C/C++ 程序中读取getenv("PATH")

现在有一个问题

  1. 我在终端输入hello=99,此时这是一个本地变量也就是只在当前进程有效,可以前面我已经知道,每执行一个命令就会创建一个子进程或者说新的bash但是为什么我使用echo $helllo依然可以获得数值呢

输入了:

hello=99
echo $hello

你发现 echo $hello 能正确输出 99,但你以为每执行一个命令都会创建一个子进程,变量应该“丢失”了。为什么没有丢失呢?


✅ 关键点:命令之间是否创建子进程,取决于命令的类型和执行方式

🔸 情况一:你在同一个 shell 中连续执行命令

hello=99     # 设置变量(本地变量)
echo $hello  # 读取变量(仍在当前 shell)

这两个命令都是在 当前 shell 进程中执行的,没有创建新的子进程。所以变量 hello 是可见的。


🔸 情况二:你执行的是外部命令或脚本

如果你运行一个脚本或外部程序,它会创建一个子进程:

hello=99
bash -c 'echo $hello'   # 输出为空
这里可以使用CTRL+d来退出当前的这个进程
再执行就可以看见输出

这里 bash -c 启动了一个新的 shell 子进程,它不会继承当前 shell 的本地变量,除非你用 export

export hello=99
bash -c 'echo $hello'   # 输出 99

✅ 总结:什么时候变量可见?

情况是否能访问本地变量
当前 shell 中连续执行命令✅ 可以
子进程(如 bash、脚本)中执行❌ 不可以(除非 export)

🧠 类比理解:变量是“桌上的便签”

  • 当前 shell 就像你的办公桌,变量是你写的便签。
  • 如果你自己看(echo),当然能看到。
  • 如果你叫别人(子进程)来帮忙,他们看不到你的便签,除非你贴到墙上(export)。

你可以试试这个实验来验证:

hello=99
bash -c 'echo $hello'        # 空
export hello=99
bash -c 'echo $hello'        # 输出 99
http://www.dtcms.com/a/461678.html

相关文章:

  • 11、规划过程组(4):风险
  • HT8698 立体声 D 类音频功率放大器:性能参数介绍
  • 做亚克力在那个网站上好上海建工一建集团有限公司
  • DOM与BOM核心用法解析
  • 如何在网站上做跳转代码最好的科技资讯网站
  • 【项目】自然语言处理——情感分析 <下>
  • 网站页面制作公司外部网站 同意加载
  • 高通平台WiFi学习--IPv6 邻居发现卸载:Wi-Fi 固件助力移动设备功耗优化
  • 网站备案 工信部如何做建材团购网站
  • 知名的咨询行业网站制作茂名网站开发
  • 网络管理部分
  • 小白逆袭----2025了,彻底弄懂react-test单元测试 基础使用(一)
  • 代做标书网站政务网站建设模块
  • (2)100天python从入门到拿捏
  • 我的云函数向 unicloud 数据库存储数据问什么 grade 字段无法存储?
  • 免费下载代码的网站做网站国外网站
  • npm install --legacy-peer-deps:它到底做了什么,什么时候该用?
  • [Tongyi] 工具集成 | run_react_infer
  • 做课题查新网站茶叶网站开发目的和意义
  • 第5章 高效的多线程日志
  • 平安建设 十户长网站地址织梦网站制作教程
  • 无人机图传系统解析:模拟与数字的应用及未来趋势,无人机图传的作用
  • Agentic AI 与 AI 编程入门:让 AI 成为学习与创作的最佳伴侣
  • CF45C Dancing Lessons 题解
  • Docker 容器 -- 编写你的第一个 Dockerfile
  • 做的好的网站开发网站空间200m
  • 虚拟机怎么做网站上海做网站天锐
  • 网站优化要怎么做才会做到最佳百度站长统计
  • ALV 单元格控制案例
  • 网站被墙 做301跳转服务器正常网站打不开