Linux中环境变量的逐步理解

mian函数的参数

假设在Linux中有如下代码:

c 复制代码
#include<stdio.h>
int main(int argc, char *argv[]) {
	printf("argc: %d\n", argc);
	int i = 0;
	for (; i < argc; ++i) {
		printf("argc[%d]->%s\n", i, argv[i]);
	}
	return 0;
}

argv是一个存放字符串的数组、argc是字符串的数量。当执行以下操作:

1)为什么要有参数?

当假设有这样的代码:

命令行的本质应用,是为了实现一个命令,可以根据不同的选项,实现不同的子功能!也是Linux中所有命令选项功能的实现方式!!!

注意

**1)**命令行参数,至少是1,argc>=1,argv[0]一定会有元素,指的就是程序名;

**2)**选项,是以空格分隔的字符串,一个字符,也是字符串!

3) argc个,argv[argc - 1]是最后一个,argv[argc]等于NULL。(所以for (; i < argc; ++i)这个循环也可以写成for (; argv[i]; ++i)。)

环境变量

1)为什么自己写的程序需要有./main呢?不能像其他命令那样直接用命令名字就能运行?

系统命令一般都存在/usr/bin目录下,命令执行时,一般就会去/usr/bin目录下去找

那么如果我们将自己的创建的命令存到/usr/bin目录下,是不是也可以直接用名字执行呢?

答案肯定的!

在目录下删除了就失效了

2)为什么会去/usr/bin/路径下去找?

Linux中,存在一个系统级的环境变量PATH,内容是以冒号分隔的多串路径。

作用:告诉系统,如果用户执行一个没有指明路径 的的可执行文件,就会依次根据PATH里的地址去查找

所以除了问题(1)中的操作,那样会污染系统命令池,不建议;我们还可以将我们自己的可执行文件的路径,添加到PATH里呀。注意:添加时不要覆盖,要追加

总而言之,PATH是环境变量中的一个,系统中也会有其他的环境变量 ,通过命令env,能显示所有的环境变量:

  • HISTSIZE(history size):系统会记录用户执行的命令,HISTSIZE=1000指的是只会记录最近的1000条命令;
  • OLDPWD:记录上一次所在文件路径,cd -命令会回到上一次所在路径,利用的就是这个OLDPWD环境变量;
  • SSH_TTY:记录的当前终端的编号/dev/pts/1
  • SHELL:记录当前操作系统外壳的具体体现/bin/bash

3)环境变量和我们C/C++代码和进程之间的关系?

用代码获取环境变量

main函数的参数可以有三个,除了上面提过的两种,还有一个char* env[],存放字符串的数组:其中存放的是,系统给当前程序提供的环境变量表!本质是把环境变量表传递给进程!

c 复制代码
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) {
	void(argc);	// 防止不用参数时警报
    void(argv);
    int i = 0;
	for(; env[i]; i++) {
	printf("%s\n", env[i]);
	}
return 0;
}

还有其他方式获取环境变量:

c 复制代码
int main() {
	extern char** environ;
	int i = 0;
	for (; environ[i]; ++i) {
		printf("environ[%d]->%s\n", i, environ[i]);
	}
	return 0;
}

当然,我们利用环境变量肯定不是这样全部看完,C语言stdlib.h提供了一个函数char* getenv(const char* name),可以通过传入对应的变量名来获取变量内容。

c 复制代码
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
int main() {
	char* whoami = getenv("USER");
	printf("用户:%s\n", whoami);
	if (whoami == NULL) {
		printf("无法执行我,不认识用户\n");
	}
	else if (strcmp(whoami, "root") == 0) {
		printf("root也不能执行!\n");
	}
	else if (strcmp(whoami, "zincsweet") == 0) {
		printf("你是合法用户,可执行!\n");
	}
	else {}
	return 0;
}

切换其他用户测试代码时,需要su - [用户名],要带杠-,将环境变量更新为对应用户的,不然执行此程序还是会显示zincsweet可执行。

环境变量由谁传递?

环境变量默认在**bash内部,据我们所知bash就是一个 进程**,进程在内存 中,所以环境变量表是临时的,内存级

内存级!内存级!内存级!内存级!内存级!

一些命令 都是bash进程的子进程 ,子进程代码和数据是可以共享 的,所以也就能拿到父进程bash里面的环境变量

总之,环境变量是父进程给的!!!可以延续继承所以环境变量具有全局性!

bash进程的环境变量是从Linux系统配置文件 来的,每次系统运行bash,都会先从系统配置文件中读取信息,将环境变量加载到bash中。

**配置文件是什么?**用户家目录下都有一个.bashrc隐藏文件,他就是配置文件,其中包含许多配置信息

本地变量

本地变量不属于环境变量

  • 无法被子进程继承;
  • 不具备全局性;
  • 只在bash内部可以访问。

但是可以取这个变量打印出来

可以通过命令export [变量名],将本地变量导出到环境变量中:

还可以直接将现成的变量导出到环境变量:

怎么从环境变量表中去掉 呢?要用命令:unset [变量名]

ort [变量名]`,将本地变量导出到环境变量中:

外链图片转存中...(img-izVQ3sXk-1779024573187)

还可以直接将现成的变量导出到环境变量:

外链图片转存中...(img-l4EZtryJ-1779024573187)

怎么从环境变量表中去掉 呢?要用命令:unset [变量名]

相关推荐
zhglhy4 小时前
Ubuntu mongodb-org-tools工具安装
linux·mongodb·ubuntu
一个想打拳的程序员4 小时前
把%20NAS、服务器、各种后台入口聚合到一个页面,Sun-Panel%20五分钟搭好
linux·运维·服务器·自动化
济6174 小时前
I.MX6U Linux 驱动开发篇---异步通知(信号)实验--- Ubuntu20.04
linux·驱动开发·嵌入式·嵌入式linux驱动开发
optimistic_chen6 小时前
【AI Agent 全栈开发】MCP
java·linux·运维·人工智能·ai编程·mcp
charlie1145141916 小时前
嵌入式Linux嵌入式Linux驱动开发:板级DTS实操与完整实战演练——从修改设备树到点亮LED的完整闭环
linux·运维·驱动开发
匆匆那年96714 小时前
VSCode 远程 Linux 使用Codex
linux·ide·vscode
SWAGGY..16 小时前
Linux系统编程:(七)Makefile入门:轻松掌握编译自动化
linux·运维·自动化
开开心心就好16 小时前
免费流畅的远程控制实用工具
linux·运维·服务器·网络·智能手机·excel
黑猫学长呀18 小时前
存储宝典第2篇:盲封TT wafer是什么意思?
linux·嵌入式硬件·项目·芯片·ufs·晶圆·产测