环境变量详解

目录

一.命令行参数

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 加载该程序运行。

相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言