Linux 环境变量是程序运行的'隐形配置',程序地址空间是进程访问内存的'底层规则',这两类知识点是打通 Linux 系统底层逻辑的关键纽带。理解它们不仅能解释'为什么命令能直接运行''进程如何安全访问内存'等核心问题,更能为编写灵活的命令行工具、排查内存相关问题提供底层支撑。
环境变量
概念: 一般是指在操作系统中用来指定操作系统运行环境的一些参数。不同的环境变量有不同的用途,通常具有全局属性(这里的全局属性意思是可以被子进程继承)。
Bash 本身在启动的时候,会从操作系统的配置文件中读取环境变量信息。每次启动,环境变量都会被重置;父进程的环境变量变了,子进程会跟着变。
常见的环境变量
- PATH: 指定命令的搜索路径
- HOME: 指定用户的主工作目录
- SHELL: 当前 shell,它的值通常是/bin/bash
- HISTSIZE:
history能保存之前使用指令的最大条数 - SSH_TTY: 终端设备的路径(SSH 远程登陆的话会有)
- USER 和 LOGNAME: 代表当前登录的用户是谁(这俩没啥区别)
- PWD: 表示当前的路径 (修改这个不会改变现在在哪个路径哈)
- OLDPWD: 通过
cd命令切换目录时,标记上一次的路径
和环境变量相关的指令
echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量 (想只看一个的话就grep那样)unset: 清除环境变量set: 显示所有本地变量和环境变量- 修改环境变量:eg:
PATH=$PATH:/home/renshen
引申:本地变量只在当前 bash 进程里有效。本地变量转变成环境变量:export 变量名 (不用加=值)。
通过系统调用获取或设置环境变量
系统调用:getenv, putenv。
引申:chdir 这个系统调用可以改路径。
main 函数的命令行参数
其实 main 函数原型为 int main(int argc, char *argv[], char *env[])。
- 第一个参数是接受到的命令行参数的总个数 (包括程序名)
- 第二个参数是命令行参数(最后一个位置会放一个
nullptr),命令行的指令当字符串传过来的 - 第三个参数是环境变量数组
在进程进行时,都会被传入两张核心向量表——命令行参数表和环境变量表。所以,不要 char *env[] 也行,直接在代码里 extern char **environ。env 怎么用,这个也怎么用,eg:environ[0]。这个全局变量指向环境变量表 (不用头文件)。
main 函数这样设置的目的——为指令、工具、软件等提供命令行选项的支持。
常规命令和内建命令
- 常规命令: 通过 bash 创建子进程执行
- 内建命令: bash 不创建子进程,自己亲自执行——类似 bash 调用系统提供的函数,比如
echo




