【Linux】环境变量

举报
平凡的人1 发表于 2022/12/15 11:10:12 2022/12/15
【摘要】 @[toc] 一、环境变量 1.概念环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性要执行一个程序,那就需要先找到这个程序,怎么去找,这时候就需要带上路径,问题来了:如果我们不想要带上路径呢?第一种方法把...

@[toc]

一、环境变量

1.概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

要执行一个程序,那就需要先找到这个程序,怎么去找,这时候就需要带上路径,问题来了:如果我们不想要带上路径呢

  • 第一种方法

把文件拷贝到系统的默认路径下,我们就不需要了:

image-20221111164152704

但是这种方式存在缺陷:我们的指令没有经过测试,尽量不要把代码安装在系统里,会污染系统指令池

之所以能够找到,是因为系统的环境变量,比如在编写代码的时候,在链接的时候,我们不知道所链接的动态静态库在哪里,但是可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找

我们可以先来看一看PATH

image-20221111183901290

  • 第二种方法

不需要带上路径的第二种做法:把当前的路径添加到环境变量里面:

export PATH=$PATH:加上路径

image-20221111184810876

image-20221111184848737

在Linux下bash(命令行)是可以定义变量。这是Linux下的环境变量,对于Xshell登录的时候系统会默认把.bash_profile执行一次,把环境变量找到当前的shell当中,所以一旦启动成功会在内存里维护一个变量$PATH

image-20221111192336710

而对于windows下的环境变量我们就非常熟悉了,比如之前配置的jdk的环境变量

image-20221111191658191

2.常见环境变量

PATH : 指定命令的搜索路径

HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

LOGNAME:当前登录的用户名

HOSTNAME:主机名

SHELL : 当前Shell,它的值通常是/bin/bash

image-20221112220551796

image-20221112220657223

image-20221111193701999

image-20221112220922279

image-20221111193914037

查看环境变量方法 :上面所说的env(查看所有的环境变量)以及echo $NAME(NAME既环境变量名称,比如PATH)


二、系统调用获取环境变量

如果我们不想通过指令去获取环境变量而是自己想要去获取,那我们就可以通过getenv获取环境变量了

1.getenv

image-20221112230720372

话不多说,下面我们就可以通过getenv直接来实践一下下:

image-20221112233331890

USER环境变量最大的意义就是可以标识当前使用Linux用户

image-20221112235105512

我们可以利用strcmp直接去判断是否为root用户:

image-20221113000429329

image-20221113000641081

这很好解释了之前遇到的问题:如何知道当前没有权限去访问,直接被拒绝呢?

执行指令的时候,通过访问任何文件,文件上面有对应的拥有者和所属组,会根据环境变量user去进行对应,对身份进行认证,环境变量会在不同的应用场景被使用


三、设置环境变量

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
  • echo

image-20221113103007392

env查环境变量并没有结果,要想找到结果,我们可以用export

  • export

image-20221113102203450

image-20221113102229655

这是正确的,这不是环境变量,程序运行时并没有找到,这时候用到export,把本地变量导成环境变量:

image-20221113103153400

1.子进程继承

在命令行上运行./mycmd的时候,bash是一个系统进程(fork),mycmd会变成一个进程,是bash的子进程,而环境变量具有全局属性的根本原因是会被子进程继承下去,因为环境变量定义给bash,而子进程会全部继承下去,这就被称为环境变量。所以环境变量具有全局性,而本地变量只会在当前进程(bash内)有效

为什么要继承下去?

答:为了不同的应用场景,比如我们上面所说的身份认证,有些子进程需要用到这些信息,确认当前用户的信息

  • set

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

image-20221113105718484

  • unset

清除取消我们的环境变量

image-20221113121558942

2.PWD

我们的系统为什么知道我们当前的路径在哪里:如一开始学的ls,加上文件名就可以了,不需要加上路径,那ls为什么知道当前的路径是在哪里?PWD

image-20221113124716060

环境变量在bash中维护当前所处的路径,路径发生变化时,shell会调整环境变量的值,而运行ls是在创建子进程,而环境变量会被子进程继承,所以ls拿到了当前路径,所以ls不需要带上路径

  • 实现pwd指令

image-20221113141141812

这个环境变量必定存在,这是系统设置的

image-20221113141120405

image-20221113141244088


四、命令行参数

main函数也是存在参数的(最多有三个)

main函数也会被系统调用。所以我们可以简单理解为main函数的参数由系统/父进程进行传参的:

下面我们先来看看其中的两个参数

image-20221113174744870

这时候我们直接去make一下会发现:

image-20221113174827616

image-20221113175041047

所以我们需要修改一下:

image-20221113175350494

image-20221113180202893

命令行参数实际上是把程序名和选项传递给argv(指针数组)的,选项多少就需要定义argv的大小。

参数的意义在于可以通过命令行选项控制使其结果不同,我们可以通过一小串代码来理解一下:

image-20221113221417411


五、代码获取环境变量

上面我们所说的getenv就是其中一种

  • 命令行第三个参数(char*env[])

image-20221113222222157

image-20221113223056961

image-20221113223151786

  • 通过第三方变量environ获取 (extern char**environ)

image-20221113224048155

image-20221113225038988

image-20221113224814315


六、环境变量的组织方式

每个进程运行的时候都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

image-20221114213027918


七、总结

总结来说,环境变量本质就是操作系统给我们设置的一批全局变量,在计算机开机启动,加载图形化窗口或者登录给我们设置好的

而对比Windows配置环境变量的原因就是找系统中对应的可执行程序的路径

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。