[Linux]环境变量

news/2024/11/17 17:39:49/

一.什么是环境变量

为了满足不同的运行场景,操作系统预先设置了一大批全局变量,这种可以指定操作系统运行环境的变量就是环境变量。

我们平常使用的指令本质上也是用C语言实现的一个个小程序,但是我们在执行我们自己的可执行程序时往往是类似这样的:./test这个意思是告诉操作系统我要执行的是当前路径下的test文件(执行一个文件首先要找到这个文件)。

使用系统指令的时候不需要带./的原因就是环境变量PATH中存放系统的默认搜索路径,我们的可执行程序不能直接执行,是因为可执行程序的路径不在PATH中。

在这里插入图片描述
在这里插入图片描述

存放指令的路径是usr/bin

1.让我们自己的程序不用带路径

a.将我们的文件放入指令池

执行ls等程序时不需要带路径是因为环境变量PATH中存放了系统的默认搜索路径,那如果我不想让我的程序在执行是带路径就只要将我的程序放入到系统的默认搜索路径中即可。
在这里插入图片描述

这里要使用sudo权限,因为拷贝在Linux就等同于安装

不建议这样,因为我们写的代码没有经过测试,直接放到系统的指令池中会将其污染

使用sudo rm /usr/bin/mytest在系统指令路径下删掉我们自己的程序

在这里插入图片描述

b.增添环境变量PATH

可以在环境变量PATH中加入我们的当前路径,这样我们的当前路径也就变成了系统的默认搜索路径。既可以不污染指令池又可以让我们的程序不带路径。

细节管们已经发现了在环境变量PATH中,路径之间是以:间隔的,所以在添加新路径的时候要在旧路径后面写:+路径

在这里插入图片描述

echo PATH=路径的方法是错误的,会将PATH中原本存在的值给覆盖掉

在这里插入图片描述

此时你再使用ls命令,它会告诉你command not found。这是因为它不会默认的再去usr/bin路径下查找了。

如果你不慎这么操作了,也没关系你只需要关掉服务器再重新启动一次,这个PATH就又会被加载成最初的模样了。

在这里插入图片描述

etc/bashrc这个文件中存放的就是各种环境变量,每当我们启动一次,这个加载操作就会被执行。


二.环境变量相关的指令

1.set:显示本地的shell变量和环境变量

2.unset:取消环境变量

3.export:将本地变量设置成环境变量

所谓的本地变量就是我们直接在bash上定义的变量,这样的变量是本地变量只在当前进程(bash)有效,不可以被子进程继承而环境变量可以被子进程所继承

在这里插入图片描述

4.env:显示所有的环境变量

在这里插入图片描述

系统之所以能知道我当前的路径是因为有个环境变量叫PWD,系统之所以能判断我有没有权限是因为有个环境变量叫USER,sudo就是将USER变量改成了root所以我就有了root权限。

5.echo:显示某个环境变量的值(echo+$变量名甚至可以查到本地变量)


三.获取环境变量

如果你想在程序中显示某个环境变量,就可以使用getenv这个系统调用函数来获取

在这里插入图片描述

可以看到它的参数是字符指针,也就是说环境变量其实都是字符串

在这里插入图片描述

因为不同用户的环境变量不同,所以结果也不同。下面我切换到root用户再执行一次这个路径的这个程序,一起来看看结果

在这里插入图片描述

实现pwd指令

既然环境变量中有一个PWD,而我现在又有了拿到环境变量的getenv函数,所以实现pwd命令对我们来说简直是有手就行。

#include <stdio.h>
#include <stdlib.h>
#define MYPWD "PWD"
int main()
{char* p=getenv(MYPWD);printf("%s",p);return 0;

在这里插入图片描述

你还可以将这个命令放到默认搜索路径下,以后这个程序就是你的另一个pwd指令

四.命令行参数

main函数也是可以有参数的(最多可以有3个),接下来我们首先看一个现象

在这里插入图片描述

如果gcc版本比较低就要主动声明一下-std=c99,否则不能支持c99标准中的某些写法

好奇怪我们打印argv数组中的内容时拿到的确实我们的可执行程序名以及我们带的选项。

所以我们可以得到这样的一个结论:命令行输入的命令其实是一个大字符串,这个字符串会被拆开然后按顺序传给argv数组

在使用指令的时候,我们不但可以单独使用指令,还可以使用指令带选项的方式,就是因为命令行的前两个参数。

int main()
{if(argc != 2){printf("Usage: \n\t%s [-a/-b/-c/-ab/-bc/-ac/-abc]\n", argv[0]);return 1;}if(strcmp("-a", argv[1]) == 0){printf("功能a\n");}if(strcmp("-b", argv[1]) == 0){printf("功能b\n");}if(strcmp("-c", argv[1]) == 0){printf("功能c\n");}if(strcmp("-ab", argv[1]) == 0){printf("功能ab\n");}if(strcmp("-bc", argv[1]) == 0){printf("功能bc\n");}return 0;
}

指令的设计就是使用这种方式,在函数中对输入指令进行判断,再执行对应指令。无非就是使用C语言对具体功能进行封装。


接下来我再将第三个参数放进来:

在这里插入图片描述

在C语言中,指针类的参数一般都是以空指针作为结尾的。

可以看到直接就拿到了整个环境变量,这和在命令行输入env命令是一样的。

此外还可以通过environ拿到环境变量:

在这里插入图片描述

environ是系统中的一个全局的二级指针,它指向命令行参数表,作为参数传递给char* env[]。environ没有包含在任何头文件中,所以在使用时 要用extern声明。

在这里插入图片描述


我们平常也不用environ,但是程序也总能拿到环境变量是因为:环境变量本身是被加载到物理内存再映射到进程地址空间的,所以即使程序不去主动的获取环境变量,那些环境变量也被加载到虚拟内存中了。

五.总结

总之环境变量就是操作系统预先设在的一大批全局变量,当我们在启动计算机时这些全局变量就会加载到内存中可以指定计算机的运行环境。


http://www.ppmy.cn/news/38539.html

相关文章

Vue路由

vue路由 文章目录vue路由1.vue-router简单使用1.1vue-router的下载1.2在main.js1.3router的配置1.4 路由的切换1.5路由指定位置的显示2.嵌套路由2.1 多级路由的配置2.2 多级路由的query传参2.3 多级路由的params传参2.4 接受路由的props参数2.编程试路由2.1 按钮的跳转2.2页面的…

ptrace注入游戏介绍

Android系统采用的是Linux内核&#xff0c;很多Linux系统上的技术都可以应用在Android系统上&#xff0c;Android系统上ptrace注入远程进程的技术就是其中一种。本章节将对ptrace注入的完整流程进行介绍。 一、ptrace函数介绍 ptrace注入技术的核心就是ptrace函数&#xff0c…

云计算基础——云存储技术简介

云存储的种类及其合适的应用 可以把云存储分成块存储与文件存储两类。 块存储 快速更改的单一文件系统针对单一文件大量写的高性能计算&#xff08;HPC&#xff09; 文件存储 文件及内容搜寻Tier-2 NAS多文件大量写入的应用数据大量读写的应用多个使用端都希望读取同一个文…

2007-2020年上市公司数字化转型数字化无形资产占比仅计算结果

1、时间&#xff1a;2007-2020年 2、范围&#xff1a;包括3600多家公司 3、方法说明&#xff1a; 借鉴祁怀锦等&#xff08;2020&#xff09;的方法&#xff0c;根据数字化相关词频手工识别企业数字化相关无形资产占比&#xff0c;相关词频在附件中。 据企业数字化转型的定…

Java 缺失的特性:扩展方法

作者&#xff1a;周密(之叶) 什么是扩展方法 扩展方法&#xff0c;就是能够向现有类型直接“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改现有类型。调用扩展方法的时候&#xff0c;与调用在类型中实际定义的方法相比没有明显的差异。 为什么需…

jsp056ssm客户关系管理系统的设计与实现hsg570685程序

1&#xff0e;系统登录&#xff1a;系统登录是管理员访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括管理员名、密码和验证码&#xff0c;然后对登录进来的管理员判断身份信息&#xff0c;判断是管理员管理员还是普通用户。 2&#xff0e;管理员管理&#xff1a…

【《C Primer Plus》读书笔记】第14章:结构和其他数据形式

【《C Primer Plus》读书笔记】第14章&#xff1a;结构和其他数据形式14.1 C 结构体定义结构结构体变量的初始化访问结构成员结构作为函数参数指向结构的指针复合字面量和结构&#xff08;C99&#xff09;伸缩型数组成员&#xff08;C99&#xff09;匿名结构&#xff08;C11&am…

Docker之Docker简介

问题&#xff1a;为什么会有docker出现 环境配置如此麻烦&#xff0c;换一台机器&#xff0c;就要重来一次&#xff0c;费力费时。很多人想到&#xff0c;能不能从根本上解决问题&#xff0c;软件可以带环境安装&#xff1f;也就是说&#xff0c;安装的时候&#xff0c;把原始…