🌎环境变量【上】
文章目录:
环境变量
什么是环境变量
关于命令行参数
环境变量 简单了解 为什么需要环境变量 系统中其他环境变量
总结
前言:
环境变量是一种非常重要的概念,它们对于系统的行为和应用程序的运行起着关键作用。那么话不多说,开启我们今天的话题!
🚀什么是环境变量
学习jvav的同学肯定都配置过环境变量,配置环境这一块可能就是劝退一些同学的原因:
那么它究竟是什么呢?环境变量 (environment variables ) 一般是指在操作系统中用来指定操作系统运行环境的一些参数。
比如:我们在写C/C++的代码时,在链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。 简单来说,整个系统就像一个王国,而每个文件就是王国大大小小的土地,这天你需要走到国都,难不成把全国走完找到国都吗?我们可以打开某德地图,直接搜索就会显示出到王都的路,去王都的路线其实就可以看作环境变量。
🚀关于命令行参数
在C/C++中,我们main函数能不能带参数?实际上是可以的:
int main ( int argc, char * argv[ ] )
{
return 0 ;
}
main函数参数其中两个参数为 int argc 和 char *argv[] ,其中 argv是指针数组,里面存的全是指针变量 ,这里我告诉你 argc是argv数组的元素个数 ,那么argv数组究竟存着什么东西?我们不妨做个实验:
# include <stdio.h>
# include <stdlib.h>
int main ( int argc, char * argv[ ] )
{
for ( int i = 0 ; i < argc ; ++ i)
{
printf ( "argv[%d]:%s\n" , i , argv[ i] ) ;
}
return 0 ;
}
我们发现,argv保存的内容恰好是我们向命令行解释器输入的内容,我们不妨在命令后多加几个选项:
这里的结果就很明显了,bash 将我们命令行参数以空格为分隔符转化为一个个的子串 ,并且 argv里的每一个指针按照顺序指向不同的子串 。
说到字符串,我们无论实在Linux还是Windows或者其他系统,都有命令行提示符,他们是怎么构成的?
这里用C语言帮助大家理解:
printf ( "[xzy@iZ0jle4p97d8x4byf3u32mZ Test2]$" ) ;
char buff[ 1024 ] ;
scanf ( "%s" , buff) ;
就像我们上面写的这段代码,打印一句话用来表示命令行提示符,使用数组接收我们输入的命令,虽然没这么简单,但是原理类似。
我们输入的命令被转化成了一整个字符串,以空格作为分隔符,将整个字符串转化为 一个一个的子串 。
而这些被截取的子串,被bash放在argv的指针数组里,这样就形成了一张表,称之为 命令行参数表 。并且 每张命令行参数表都 以NULL结尾 ,我们可以来验证一下:
# include <stdio.h>
# include <stdlib.h>
int main ( int argc, char * argv[ ] )
{
for ( int i = 0 ; i < argv[ i] ; ++ i)
{
printf ( "argv[%d]:%s\n" , i , argv[ i] ) ;
}
return 0 ;
}
既然以NULL结尾,而NULL的字面意义就是0,那我们的循环以argv[i]为循环体按理来说也是可以的:
所以这样也能获取到我们的命令行参数。现在我们知道了C语言 main函数中两个参数是由bash维护并创建和传参的 。但是为什么要这么做?
我们以下面一段代码来帮助理解:
1 #include< stdio. h>
2 #include< stdlib. h>
3 #include< string. h>
4
5
6
7 int main ( int argc, char * argv[ ] )
8 {
9 if ( argc != 2 )
10 {
11 printf ( "Usage:\n\t%s -number[1-3]\n" , argv[ 0 ] ) ;
12 }
13
14 if ( strcmp ( "-1" , argv[ 1 ] ) == 0 )
15 {
16 printf ( "function1\n" ) ;
17 }
18 else if ( strcmp ( "-2" , argv[ 1 ] ) == 0 )
19 {
20 printf ( "function2\n" ) ;
21 }
22 else if ( strcmp ( "-3" , argv[ 1 ] ) == 0 )
23 {
24 printf ( "function3\n" ) ;
25 }
26 else
27 {
28 printf ( "unknown!\n" ) ;
29 }
30 return 0 ;
31 }
上面是我们根据输入的命令行参数的选项来做不同功能的函数:
这样我们就可以通过不同的选项,让我们同一个程序执行它内部不同的功能。
这个功能是不是很像我们的指令?(比如:ls 指令)
为什么我们指令可以根据不同的选项而做出不同的动作?原因就在于我们的选项传递到main函数中的 argc 和 argv当中,所以能够完成同一个指令根据不同选项做出对应的功能。
所以,选项的本质就是命令行参数!
我们来根据上面的代码优化为具体的功能:
1 #include< stdio. h>
2 #include< stdlib. h>
3 #include< string. h>
4
5
6
7 int main ( int argc, char * argv[ ] )
8 {
9 if ( argc != 4 )
10 {
11 printf ( "Usage:\n\t%s -[add|sub|mul|div] x y\n\n" , argv[ 0 ] ) ;
12 }
13
14 int x = atoi ( argv[ 2 ] ) ;
15 int y = atoi ( argv[ 3 ] ) ;
16
17 if ( strcmp ( "-add" , argv[ 1 ] ) == 0 )
18 {
19 printf ( "%d + %d = %d\n" , x, y, x + y) ;
20 }
21 else if ( strcmp ( "-sub" , argv[ 1 ] ) == 0 )
22 {
23 printf ( "%d - %d = %d\n" , x, y, x - y) ;
24 }
25 else if ( strcmp ( "-mul" , argv[ 1 ] ) == 0 )
26 {
27 printf ( "%d * %d = %d\n" , x, y, x * y) ;
28 }
29 else if ( strcmp ( "-div" , argv[ 1 ] ) == 0 )
30 {
31 printf ( "%d / %d = %d\n" , x, y, x/ y) ;
32 }
33 else
34 {
35 printf ( "unknown!\n" ) ;
36 }
37 return 0 ;
38 }
~
所以通过以上的例子,我们可以深刻理解,命令行参数时Linux选项的基础。
🚀环境变量
✈️简单了解
环境变量不是一个,而是一堆,他们彼此并没有什么关系。环境变量,一般是系统内置的具有特殊用途的变量。
环境变量有“变量”两个字,而我们都知道,变量的本质其实是开辟空间,在运行期间我们的程序也能开辟空间 。
但是环境变量,并不是我们语言意义上的变量,操作系统/bash 是用C语言写的,系统的环境变量就是系统自己开辟的空间,给他名字和内容即可 。
至于为什么叫做变量?因为环境变量的本质和语言中变量的本质没什么大的区别,而且环境变量也是可以更改的,所以被形象的称为 “变量”。
✈️为什么需要环境变量
我们先来看一个现象:
我们为什么一定要使用 ./才能运行我们写的程序,而像ls,pwd等等这些命令却不需要使用./呢?
这就是因为在系统当中 存在一个 全局的 环境变量 , 叫做 PATH ,今天我们要看一看这个环境变量,需要使用如下指令:
echo $环境变量名
我们执行的任何命令都会在通过该环境变量目录下进行搜索,可以看到这里不仅仅只有一个路径,当一个路径内没找到就会去下一个路径进行搜索,直到将最后一个路径查找完,如果依旧没发现则就会出现上面那种情况。
但是今天,我就是想要自己的程序不带 ./ 也能运行起来,当然可以,我们有两种做法:
1、拷贝到环境变量内对应的bin目录下:
这个时候就能不使用 ./ 就可以运行我们的程序了。
其实这个过程就相当于把我们的程序安装到系统里,因为这是个半成品,我并不推荐这样做,这样做会污染我们系统的默认命令值。
2、把我们程序当前的路径添加到环境变量中
这样我们就把程序添加进环境变量中了,但是为了保证原PATH值还存在要在 末尾加上 :$PATH 即可 。
如果不小心忘记把原来的环境变量加上:
这个时候其他的命令全部用不了了,这个时候不要急,我们只需要退出重登即可:
这是因为当前仅仅是在内存中更改了环境变量,并没有在磁盘中更改,所以 重新登录还是从磁盘拿数据 ,就能恢复如初了。
✈️系统中其他环境变量
为什么一开始系统就会知道我们的路径?其实在系统中存在 PWD 环境变量,我们 每一次对路径做修改都会被 PWD 所记录 :
甚至我们当前登录的用户是谁,也是有环境变量记录的:
系统中还有很多很多环境变量,我们可以使用 env 命令查看:
系统其实就是通过维护这么一大串的环境变量,所以系统才能通过环境变量认识 “你”。
📒✏️总结
环境变量是系统中很重要的一个东西,系统是 通过所有的环境变量来认识你 的。 main函数里的参数其实就是命令行参数的个数和字符串。 让自己的程序能像指令一样运行有两种方法,一种是将指令添加到bin目录下,另一种是将程序地址放在PATH环境变量当中 。
如果这篇文章对你有帮助的话,还望留下一个小小的赞支持博主呀~~