【Linux】---环境变量
创始人
2024-02-05 04:54:39
0

文章目录

  • 环境变量
    • 环境变量测试
    • 和环境变量相关的命令
      • echo
      • env
      • export
      • unset
      • set
    • 环境变量的组织方式
    • main函数的几个参数
      • 第三个参数
    • 环境变量的全局性

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,例如:

平常我们去执行一个程序一般都会带上 ./ 也就是指定该执行程序的相对路径

但是为什么我们去执行 ls pwd 这些指令时却不需要带上呢?

这是因为这些指令操作系统已经可以通过环境变量去获取,所以不再需要我们去指定了

环境变量测试

常见的环境变量例如 PATH HOME SHELL

PATH 它是用来指定命令的搜索路径的

查看当前所有的环境变量可以使用 env指令查看,因为比较长就不演示图片了,可以自行输入查看。

查看指定环境变量可以使用 echo $环境变量名

image-20221118100058169

上面显示的就是PATH当前的环境变量值,因为PATH中已经有我们平常使用的一些指令的路径,所以当我们使用 ls pwd 等指令时就不再需要去指定其相对路径了。所以当我们编写好程序后,把可执行文件拷贝到环境变量已有的路径中后,我们执行程序时也同样可以不再指定其路径

image-20221118101719404

HOME:指定用户的主工作目录,也就是用户登录到Linux中,默认的目录

所以在不同的用户下,该变量是不同的值。根据这个特点,我们可以利用获取当前的用户HOME变量从而实现不同的功能,下面以root用户和hjb用户举例。

首先在Linux中我们可以通过调用**getenv()**函数去获取指定的环境变量,如果不存在则返回NULL,注:环境变量的值都是一个字符串类型

image-20221118103402940

现在先编写一个程序实现查看当前的用户名

image-20221118104400180

可以看到,同一个程序当时在不同的用户下执行得到的结果是不一样的。利用环境变量这一特性,可以让同一个程序在不同的用户下执行不一样的操作

image-20221118104904591

和环境变量相关的命令

echo

这个是用来显示某个环境变量值的,上面已讲

env

查看所有环境变量

export

设置一个新的环境变量

在讲这个命令首先我们先来认识一下什么是本地变量。在Linux下也是可以直接去定义一个变量的,但是直接定义的变量相当于一个局部变量,所以其实的这个变量并不是一个环境变量,注意环境变量是一个全局的变量

image-20221118110102186

因为定义的变量MYVAL并不是一个环境变量,所以此时找不到该环境变量,就报错了。

这是 export指令就可以用上了,当我们定义变量加上exprot 指令后,该变量就会变成一个环境变量

image-20221118110445761

此时,该变量就是一个环境变量了,使用env查看全部环境变量找也是可以找到的

unset

既然有创建一个新的环境变量,那就会有删除环境变量,unset就是用来删除一个环境变量的

image-20221118110934113

set

显示本地定义的shell变量和环境变量

image-20221118111232831

环境变量的组织方式

环境变量是存放在环境表里的,而环境表就是一个字符指针数组,也就是说环境变量本质上就是一个字符串。每个程序都会受到一张环境表。

在这里插入图片描述

main函数的几个参数

我们在编写代码时,main函数一般都不带参数的,但其实main函数可以有三个参数的

int main(int argc, char* argv[], char* env[]){}
  1. argc是个整型变量,表示命令行参数的个数(含第一个参数)。
  2. 第二个参数:argv是个字符指针的数组,每一个元素一个字符指针,指向一个字符串。这些字符串就是命令行中的每一个参数(字符串)
  3. 第三个参数:envp是字符指针的数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针

这三个参数都是命令行传入的,现在看一段代码来体会一下

image-20221118113142518

可以看到,argv[]是获取我们在命令行上输入的指令的,当我们只是输入一个执行指令,那main函数接收到的也就只有一个,如果我们加上几个选项之后获取的就不止一个了。所以根据这个特性,我们可以通过对选项的识别进行不同的操作。

#include
#include
#includeint main(int argc, char* argv[], char* env[]){//如果命令行输入两个以上指令则报错if(argc != 2){printf("Usage:\n\t%s [-a/-b/-c/-ad/-bc]\n",argv[0]);return 1;}//不同的选项对应不同的输出//识别argv接收的第二个元素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("-ad", argv[1]) == 0)printf("-ad\n");if(strcmp("-bc", argv[1]) == 0)printf("-bc\n");return 0;
}

image-20221118114037181

第三个参数

这个参数通俗讲就是所有的环境变量来着

#include
#include
#includeint main(int argc, char* argv[], char* env[]){for(int i = 0; env[i]; i++)printf("env[%d]:%s\n", i, env[i]);return 0;
}

可以通过这段代码,就可实现env指令的功能了。

如果不给main函数传参的话也是可以实现的,系统本身给了我们一个变量

extern char** environ

该变量记录的也是所有的环境变量,因此以下代码也是可以输出所有的环境变量

int main(int argc, char* argv[], char* env[]){extern char** environ;for(int i = 0; environ[i]; i++)printf("env[%d]:%s\n", i, environ[i]);return 0;
}

环境变量的全局性

环境变量通常具有全局属性,可以被子进程继承下去

大家可以想想,为什么将环境变量定义后,就不需要再加路径去执行程序了呢?

程序在执行的时候就会变成一个进程,所有的程序都可以看作是一个进程。所以bash本身就是一个系统进程,我们编写的可执行程序一旦开始运行就也会变成一个进程,并且是bash这个系统进程的子进程,因为环境变量具有全局性,所以它是会被所有的子进程继承下去的,在应对不同的场景时bash就会帮助该程序找相应的路径进行身份认证,所以当环境变量存在时就不再需要通过路径去执行程序了

像本地变量就不一样,它是只会在当前进程内有效,也就是bash进程。

相关内容

热门资讯

UCL补录政策更新:邮件注册快... 重点关注!UCL官方正式更新2025补录政策: UCL 补录于7 月 5 日启动,考生需在出分后通过...
河北网友质疑承德避暑山庄免票政... 极目新闻记者 郭迩 近日,有网友在社交平台发帖称,承德避暑山庄所售卖的老人票,只有北京、天津户籍60...
大学校长公开手机号,四年回复学... 4年前新校长一个看似“随意”的举动,如今已成为撬动一所大学治理模式变革的支点。 2021年9月,新上...
公司拒录“E人”招人先做550... 封面新闻记者 赵奕 面试要求先做550道性格测试?公司拒绝录用“E”(外向)人?近日,有网友在社交平...
行进中国|政策“扩区” 企业“... 一组组特制的导尿管工装模具在全自动生产线的运送下,经过5次成膜、烘干,形成一根根裸管,再经过安装球囊...
俄共通过决议:认定赫鲁晓夫关于... 【文/观察者网 熊超然】当地时间7月5日,俄罗斯联邦共产党第十九次报告和选举代表大会开幕。据俄新社报...
广州“购房入户”政策暂未实施 7月5日,广州市人民政府发布了关于重新发布《广州市户籍迁入管理规定》的通知。根据通知, 原有的户籍迁...
受美政策影响,台积电推迟日本工... 参考消息网7月6日报道据美国《华尔街日报》7月4日报道,知情人士称,台积电正推迟在日本的第二家工厂的...
用杀虫剂杀“蟑螂”,邻居生气了... 近日,杭州一小区住户杨某在家门口发现疑似“蟑螂”的踪迹,迅速用杀虫剂进行消杀,没想到的是,他喷洒药剂...
穆西亚拉重伤记者:世俱杯是现代... 直播吧07月06日讯 拜仁vs巴黎上半场尾声,穆西亚拉遭遇脚踝变形重伤。中场时记者François ...