环境变量详解

目录

一.命令行参数

1.定义

2.main函数的参数

二.环境变量

1.是什么

1.1定义

1.2分类(环境文件)

1.3.进程中的环境变量表

2.认识一些环境变量

2.1.PATH

2.2.其它环境变量

3.对环境变量的操作(增删查改)

3.1.查看

3.2增加

3.3删除

补充:


一.命令行参数

1.定义

运行程序时,在命令行里跟在程序名后面输入的额外数据,用来给程序传递指令、文件路径、配置、选项等。

比如:

其实就是程序内部就能读取这两个字符串,实现不同逻辑。

2.main函数的参数

main函数的参数就是负责接收命令行参数的

复制代码
int main(int argc, char *argv[], char *envp[]);

1.argc代表参数个数,统计范围包含程序名本身,最终参数总数量就等于 argc 的数值。

2.argv是存放命令行参数的字符串数组,类型为字符指针数组,数组里的每一个元素都是独立字符串。

------其中 argv 0 固定存储程序名或程序所在路径;argv 1、argv 2 及后续元素,依次对应我们在命令行中手动输入的各个参数。

  1. *char envp\[\]环境变量数组。

我们来测试一下:

效果:

作用:

main函数的参数接收参数之后会完成相应任务

演示:

二.环境变量

1.是什么

1.1定义

环境变量是操作系统给进程传递的一组「键值对」配置,用来保存系统运行环境的信息和为进程运行提供相应信息,保障运行。

键=值(比如 PATH=/usr/bin:/bin

解释一下:比如我们并没有在代码里完整写出函数库的位置,但是代码却能正常运行,说明该进程的环境变量表已经记录了

1.2分类(环境文件)

按生命周期分类:

  1. 临时环境变量:

关闭终端、会话结束后自动失效

通过终端 export 命令临时创建

2.永久型:

由系统 / 用户配置文件定义,重启终端、重启系统依然有效。

按作用域划分:(存在位置)

1.系统环境变量

系统所有登录用户、所有进程均生效

配置文件(全局,需管理员权限修改):

  • /etc/profile
  • /etc/bashrc
  • /etc/environment

2.用户环境变量

作用域:仅当前登录用户生效,其他用户无法读取。

在用户家目录 下

  • ~/.bashrc
  • ~/.bash_profile / ~/.profile

1.3.进程中的环境变量表

1.环境变量表组织形式

纯文本,一条条 key=value 字符串(环境变量本体)、命令行参数字符串。存在于栈中

environ 是一个全局字符指针数组,依靠该指针遍历和命令参数对比即可寻找到对应变量,相等于envp

2.进程中环境变量表的创建

最开始的:

来自 Linux 系统中的几类磁盘配置文件,系统启动 / 用户登录时会自动读取这些文件,生成 Shell 进程的环境变量表。

后续进程:

新进程(子进程)诞生时,会完整拷贝父进程的环境变量表,如果要改变,就会写时拷贝

2.认识一些环境变量

2.1.PATH

作用:

Shell 执行命令时,若不写完整路径,系统会按 PATH 里的目录顺序依次查找可执行文件。

由相关配置文件形成(给进程)(永久环境变量):

系统级(全局,所有用户)

/etc/environment:系统底层基础 PATH

/etc/profile / /etc/bashrc:补充、修改全局 PATH

用户级(仅当前用户)

~/.bash_profile / ~/.profile /

~/.bashrc:个人追加自定义路径后加载的配置会覆盖 / 拼接前面的 PATH

相关操作:

1.查看

2.添加自己的文件路径

PATH=路径//直接覆盖

PATH=$PATH:路径//尾部接上

2.2.其它环境变量

HOSTNAME:指主机的名称。

SHELL:bash所在的路径。

HISTSIZE:记录历史命令的条数,这就是为什么我们能够查找历史命令的原因。

USER:创建bash 的用户。

PWD:当前的工作路径。

OLDPWD:最近切换的一次路径。

MAIL:当前用户的邮件存放目录。

HOME:代表家目录

3.对环境变量的操作(增删查改)

3.1.查看

1.echo $变量名 //查看单个变量

2.env//查看所有环境变量

3.main的参数env:在代码中查看

4.系统调用:getenv()

char *getenv(const char *name)

前面操作的底层实现都是environ指针数组实现的:通过遍历搜寻数组

比如getenv的实现:

复制代码
extern char **environ;

char *getenv(const char *name)
{
    int i = 0;
    // 1. 遍历整个环境变量表
    while (environ[i] != NULL)
    {
        char *str = environ[i];
        char *eq = strchr(str, '='); // 找分隔符 =

        // 2. 对比 key 名称
        if (eq != NULL && 
            (eq - str) == strlen(name) && 
            !strncmp(str, name, eq - str))
        {
            // 3. 匹配成功:返回 = 后面的值的指针
            return eq + 1;
        }
        i++;
    }
    return NULL; // 没找到
}

3.2增加

临时:

export 变量名=变量值

永久:直接编辑shell配置文件(脚本)

1.vim ~/.bashrc//打开

2.export USER_VAR="用户永久变量"

3.source ~/.bashrc//立即生效

3.3删除

临时删除(当前会话)

unset 变量名

永久删除

  • 打开配置文件,删除对应的 export 变量=值 行;
  • 执行 source 文件名 生效。

补充:

1.内建命令(Built-in Command)

命令逻辑直接集成在 Shell 程序内部 ,不是独立可执行文件。执行时不创建新进程,在当前 Shell 进程内直接运行。

特点:

执行效率速度快,省去创建进程、读取磁盘、加载程序的开销。

可修改当前 Shell 状态能够直接改动当前 Shell 的工作目录、环境变量、局部变量、终端属性等。

2.常规命令(外部命令 / 磁盘命令)

是独立的可执行文件,存放在磁盘目录(如 /usr/bin/bin)。执行时 Shell 会调用 fork() 创建子进程,再通过 execve 加载该程序运行。

相关推荐
致Great2 小时前
Claude Code 上线 Dynamic Workflows:一句话调度 1000 个子智能体并行干活
java·linux·服务器
满天星83035772 小时前
【Git】原理及使用(三)(分支管理)
linux·git
载数而行5203 小时前
Linux 2 基本实操(远程操控,远程传输,vi/vim编辑器,关机重启,xshell的用户登录注销)
linux
me8323 小时前
【Linux】Linux 目录命名规范溯源(Linux各个目录究竟是干嘛的)
linux·运维·数据库
lolo大魔王3 小时前
Linux 内置命令与外部命令超详解(区别、原理、查找、执行流程)
linux·运维·服务器
H Journey3 小时前
Linux 查看进程端口占用命令整理
linux·运维·服务器
着迷不白3 小时前
二、Linux命令3要素及系统结构+文件的增删改查
linux·运维·服务器
zzzyyy5383 小时前
System V IPC 全链路深度解析 —— 从信号量原子性到内核多态再到物理内存共享
linux·服务器
不吃土豆的马铃薯4 小时前
Socket 网络编程实战教程
linux·服务器·开发语言·网络·c++·算法