【Linux】环境变量

简介: 【Linux】环境变量

👉环境变量👈


基本概念


  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

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


7976dd6ef4704d3b8c3eb2c33c489a22.png

db661f3ad6224a58b0068fb6a9572172.png

ls、pwd 等指令其实是可执行程序,而我们编译生成的也是可执行程序,为什么不能像 ls、pwd 等就输入指令就可以执行对应的可执行程序呢?而需要输入./myprocess才能执行我们写的程序呢?


其实要执行一个程序或(指令),首先需要找到这个程序,而./myprocess就是指明在当前路径下找该程序。那是不是 ls、pwd 等指令就不用找呢?其实不是,这些指令也需要通过路径来找到对应可执行程序,只不过这个工作交给操作系统做了。


那如果我们想要输入指令就可以执行我们的程序,怎么才能做到呢?一种方法是将我们的可执行程序拷贝到/usr/bin/路径下,但是不建议这么干!

4fe13747ff944ad5983e6aa04828117e.png

还有另一种方式就是将当前路径添加到环境变量 PATH 中。


echo $PATH #查看环境变量PATH


26fe4f860eb44283bfe5d56697c50ed8.png


注:当我们输入一个指令时,操作系统会在环境变量 PATH 中的路径查找,看是否有指令所对应的执行程序。如果没有就报错,有就执行相应的程序。环境变量 PATH 中的路径是以冒号 : 进行分隔的。


将当前路径导入环境变量 PATH 中


da5cd0c29d5a4f849f791941279230e2.png


上图的导入方式是错误的,其会将 PATH 中原有的路径覆盖掉,进而导致很多的指令无法使用。不过,这个问题很容易解决,只需要重新启动一下 Xshell 就可以了。当然,也可以自行调回来。

4d9066615ae44b0098f2620d09e412c8.png

正确的导入方式


export PATH=$PATH:当前路径 #将当前路径导入环境变量PATH中


4ebfbe2d6d824cafaf0adfe945f5ec1f.png


注:系统的默认搜索路径就是环境变量 PATH 中的路径。


在命令行 bash 中也是可以定义变量的,环境变量也是这么定义的。

d6f9aac1003d4ee78b12add1604eae0a.png

系统帮我们配置的环境变量,每次开机操作系统都会帮我配置好。

57756352330d49d3a664518aee006ba4.png


常见环境变量


  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • HOSTNAME:主机名

LOGNAME:当前登录用户的用户名

HISTSIZE:历史命令最大容量


8310616b79b540e3828cf73fffe35e33.png


env #查看全部环境变量

24d0245afe6d46fa8b37df94bf8f4bd3.png


设置环境变量


d73a32798db245cabdec6df3641dd890.png


通过myval=1234567类似的方式设置的是本地变量,相当于 C/C++ 中的局部变量,而环境变量是具有全局属性的。所以无法在环境变量中找到myval。


df1f963520924187a1990dd4411cf9ec.png

注:getenv 函数能够获取到指定的环境变量。如果没有指定的环境变量返回 NULL,有的话返回指向该环境变量字符串的首元素地址。

5092b83135734221a65c3ee613de175e.png

c2a80dc724394417951ee84675cf042d.png

export 本地变量 #将已经定义好的本地变量导入到环境变量中
export 变量名=字符串 #将变量导入到环境变量中


注:环境变量默认都是字符串,所以设置时双引号可以带也可以不带,但最好带上。因为环境变量的内容有可能会有空格。

89069f3c1682444aa8b513a0563b1b5c.png

mycmd 是系统进程 bash 的一个子进程,mycmd 会继承父进程的具有全局属性的环境变量。为什么要继承环境变量呢?其实是为了满足不同的应用场景,如:让 bash 帮我找指令所处的路径以及身份认证等等。


为了说明环境变量具有全局属性,我再给大家举一个例子:ls 是一个可执行程序,显示当前路径的文件。那 ls 是怎么知道现在所处的路径呢?其实系统进程 bash 有一个环境变量 PWD,其所记录的就是当前路径。ls 指令执行也是创建进程来执行的,那么它就会继承父进程 bash 的全部环境变量,进而知道当前所处的路径。


6bdf75c095914565924de064dc2f96fb.png


0eaa73714456424aab6267d11ba360c2.png

上图的代码是不是就相当于我们写了个 pwd 指令啊?其实是的!!!这也就是环境变量所带来的意义!以前我们所使用的指令,也是通过 C语言写的。如果我们自己写的代码再加上一些系统调用接口和环境变量,也能实现系统给我们提供的指令。


2ebcab189e124cf59077807fa6a7f76f.png

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


e9a4c39cfe5847c9b6b029757cbb6178.png


清除环境变量和本地变量


unset 环境变量 #清除指定的环境变量
unset 本地变量 #清除指定的本地变量


c3bd2f246ec1420bb24b2e11c03d584f.png

6a536124f7f040aabca513951fb746de.png

获取环境变量


dbb24992e13141498f425f81d154c256.png


82e83c1d34e74f7cb5663551ce8b1b45.png

86402081db2f4052b1fd2e848472e018.png


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


54a0cf3ad64c4782b87ef4db74764873.png

3a711299fed246b9a94632bf7e4182ff.pnga3dbfab6d43b49b8b5347ca5ef3f2978.png

562ef9bdb1464c29a7555a95e51d1015.png


以前我们执行一些指令或者打开一些文件会提示我们权限不足Permission Denied,原因就是通过环境变量USER得知当前的登录用户与文件的拥有者、所属组相比,看当前用户是不是属于这两个角色,也就知道当前用户有没有对应的权限。


main 函数的命令行参数


eac22e640d8a4103afb92d6bf959cfe1.png

84818e37aa404c29800071063e0c7aa3.png

5bc0b1b7dee54befb885e83f34e87d3c.png那命令行参数有什么用途呢?其实命令行参数让程序根据参数的不同而做不同的事情!见下方例子:

cea9d7899aa245e5a48266e696f9ed0a.png

ec7fc2a58bee429f8ed640f145a3e746.png

命令行参数最大的意义就是根据选项的不同,让程序执行不同的任务和功能。


其实 main 函数还有第三个参数,就是字符指针数组char* env[],其也是以NULL结尾的。main 函数的第二个参数是命令行参数表,第三个参数是环境变量表。


f71c873d8ffe46d6a783ac1e2a60045a.png

f0c40e48d24e441ea63ed0c5d9763cb8.png


通过上图就可以看到,操作系统确实会把环境变量传给 mian 函数的第三个参数char* env[],且该数组是以NULL结尾的。


32e84db33a98450680da89ac446bd245.png


除了上面的两种获取环境变量的方式,还有一种方式就是利用char** environ来获取环境变量。其实指针environ就是指向环境变量表char* env[],它是是初始化好的全局的二级指针。


91d0f05ab67c41d6b0c578bb374fc235.png


6728639aa9374419b7330bc880832912.png


2188dd0a67224452889720a7d2559acc.png

afc56502d58349029f4f5588b0d99b0b.png


以上就是在进程的上下文中,获取环境变量的三种方式。

  • getenv
  • char* env[ ]
  • extern char** environ


注:stat 可以获取文件的属性。本地变量不能被子进程继承,echo 命令也是一个子进程,但可以使用 echo 命令来打印本地变量。


👉总结👈


本篇博客主要讲解了什么是环境变量、为什么要有环境变量、环境变量的应用场景、常见的环境变量、如何设置、清楚和获取环境变量等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️


















相关文章
|
5月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
15天前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
28 4
|
5月前
|
Java Linux
linux 对子用户配置java 环境变量
linux 对子用户配置java 环境变量
42 3
|
4月前
|
Linux Shell
在Linux中,如何设置环境变量?
在Linux中,如何设置环境变量?
|
4月前
|
Shell Linux
在Linux中,什么是环境变量?如何设置和查看环境变量?
在Linux中,什么是环境变量?如何设置和查看环境变量?
|
5月前
|
Linux
Linux环境变量及作用
Linux中的环境变量是系统配置参数,如HOME指示用户家目录,MAIL指邮件位置。`env`命令显示所有环境变量。系统有数百个变量,但了解关键的几个足够,如PATH、HOME、TERM等。环境变量由变量名和值组成,可自定义,如WORKDIR。局部变量需用`export`使其全局有效,以便其他用户使用。`su`命令用于切换用户,展示不同用户环境下变量值的差异。
Linux环境变量及作用
|
5月前
|
Ubuntu Linux Shell
Ubuntu/linux系统环境变量配置详解
理解和掌握如何配置环境变量对于使用和管理Ubuntu/Linux系统非常重要。
262 2
|
6月前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
102 4
|
6月前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
43 3
|
5月前
|
Java Linux Shell
【Linux】深度解剖环境变量
【Linux】深度解剖环境变量
42 0