环境变量相关

目录

1、shell里的变量类型

1.1、局部变量 

1.2、环境变量 

1.2.1、​环境变量的补充说明

1.3、shell变量 

2、常见的环境变量

2.1、PATH

2.2、HOME

2.3、SHELL(这里的SHELL是一个具体的变量的名称)

3、和环境变量相关的命令

3.1、echo $xx(显示某个环境变量值)

3.2、env

3.3、export

3.3.1、int putenv(const char * string)

3.4、unset

3.5、set

4、为什么运行系统文件如ls可以不带路径,而运行用户自己编写的可执行文件prog却要带路径,如 ./prog(.代表当前路径,/代表路径分隔符)

5、在命令行中修改环境变量,这种修改只在本次登录有效

6、main函数中的三个参数是什么?

6.1、char *env[ ]

6.2、获取所有环境变量的三种方式

6.3、char*argv[ ]

6.4、 int argc

7、外壳程序shell自身的环境变量是从哪来的呢?(了解即可)


1、shell里的变量类型

注意下面不管是什么类型的变量,他们的值只能是字符串类型,如给变量输入666,666是字符串而不是整形,这点和语言层面的变量不一样。

1.1、局部变量 

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。如何设置局部变量呢?xx=yy即可,xx代表局部变量名,yy代表变量的值。所以也可以看出设置局部变量和设置环境变量的区别是xx=yy前面有无export关键字。

1.2、环境变量 

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。子进程的环境变量是从父进程继承的,默认父进程的所有的环境变量都将被子进程继承,也就是说一个父进程的环境变量会不断被子进程,然后又有子进程的子进程继承,一代传一代,所以环境变量又被称为全局变量。比如用户编写的可执行程序或者输入的各种指令,由于它们的父进程都是bash,所以它们这些子进程都继承了bash的环境变量。

1.2.1、​环境变量的补充说明

环境变量就只是一个变量,不是一个文件。

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

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

Shell的环境变量通常是从其父进程继承的。当你启动一个新的Shell会话时,新Shell会继承父Shell的环境变量,包括用户登录时的环境变量。这意味着在新的Shell中,你将能够访问和使用与父Shell相同的环境变量。具体来说,在Linux和类Unix操作系统中,当你登录时,通常会启动一个Shell进程,例如bash。这个Shell进程是登录Shell,它会读取用户的配置文件(如.bashrc.bash_profile),并设置一些环境变量。然后,如果你从登录Shell中启动新的子Shell(例如通过运行一个新的终端窗口或执行一个Shell脚本),这些子Shell会继承登录Shell的环境变量。请注意,子Shell可以修改继承的环境变量,但这些更改只会影响到该子Shell及其子进程,不会影响到父Shell或其他Shell会话。这是因为每个Shell会话都是独立的进程,它们拥有自己的环境变量副本。

1.3、shell变量 

是由shell程序设置的特殊变量,即环境变量和局部变量都是shell变量,这些变量保证了shell的正常运行。

2、常见的环境变量

2.1、PATH

存储命令的默认搜索路径。即不带路径输入一条命令时,如ls,默认就会去PATH变量中存的路径里找。

2.2、HOME

存储用户的默认主工作目录(即用户登陆到Linux系统中时, 默认的目录)。用户输入cd~之所以能回到家目录,也是因为HOME这个环境变量里存在家目录的路径。

2.3、SHELL(这里的SHELL是一个具体的变量的名称)

SHELL变量的值表示当前Shell, 它的值通常是 / bin / bash​。

3、和环境变量相关的命令

3.1、echo $xx(显示某个环境变量值)

xx为环境变量。如echo $PATH。不加$,即echo PATH会将PATH这个文本打印在显示器上,只有加$才能说明PATH是一个变量。

3.2、env

查看所有的环境变量。可以通过env|grep xx寻找指定的环境变量,xx代表环境变量名。

3.3、export

1.用于在命令行上设置一个新的环境变量。如export whatever=666,就给shell即父进程设置了一个环境变量whatever,值为字符串666,注意所有变量的值只能是字符串。

2.在命令行上export设置环境变量,本质是在shell进程里调用putenv函数。导入环境变量时,本质是将代表环境变量的字符串的地址添加进一个字符指针数组中,这个数组就是地址空间中的命令行参数环境变量区,在栈区的上面,即高于栈区,不可以直接操作这个数组,必须通过putnv函数维护。

3.所以在自己编写的myshell中,如果需要获取环境变量,记得将存储环境变量的空间和存储指令的空间分离,避免出错,比如:首先运行自己写的myshell,在myshll中export myvalue=666,然后再次输入指令./proc让myshell创建的子进程先进行进程替换,将子进程替换成进程proc,文件proc中有语句printf(“%s\n”,getenv(“myvalue”)),但发现子进程proc打印的环境变量为null,这是因为在myshell再次输入指令./proc时,由于通过export指令调用putenv函数导入环境变量本质只是将代表环境变量的字符串的地址填入了表示环境变量区的数组,而myshell中是有循环逻辑的,再次输入指令时,即输入./proc时刷新了之前的myvalue=105,也就是说,环境变量区中数组存储的指针现在指向的空间,存储的是字符串./proc,当然获取不到myvalue=105了。这里数组中存储的地址没有变化,但是地址上的数据,即存储的字符串发生了改变,从myvalue=105变成了./proc。

3.3.1、int putenv(const char * string)

1.在头文件<stdlib.h>中,putenv()用来改变或增加环境变量的内容。

2.参数string的格式必须为“name=value”,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。

3.执行成功则返回0,有错误发生则返回-1。

3.4、unset

清除环境变量。

3.5、set

显示本地定义的局部变量和环境变量,即所有变量。而之前的命令如env只能看环境变量,看不了非环境变量。

4、为什么运行系统文件如ls可以不带路径,而运行用户自己编写的可执行文件prog却要带路径,如 ./prog(.代表当前路径,/代表路径分隔符)

一个指令如果不带路径,默认是到PATH环境变量的值(即字符串)所对应的路径里找,如上图ls在/usr/bin路径下,又因为/usr/bin是PATH的值的一部分,所以无需带路径即可运行ls。上图中的字符串以冒号(:)结尾,如 /usr/bin:是一个整体。

所以说,如果想让自己的程序不带路径就可以运行,有两种方式。

1.首先pwd,然后把当前路径export到PATH这个环境变量中即可。

格式为export PATH=$PATH:/xx/xxx。冒号后面的xx表示绝对路径。如下图:

 2.将你的可执行程序mv移动到PATH值对应的任意一个路径中即可。不过一般不建议这样做,因为mv到PATH的任意路径下本质就是将你的可执行程序安装到了系统里,会污染系统的命令池。

5、在命令行中修改环境变量,这种修改只在本次登录有效

正如标题所说,只要不在配置文件中修改就问题不大,如果修改了配置文件,每次登录都有效。修改环境变量的方式, 直接xx=yy,xx代表环境变量,yy代表输入的变量值。如下图PATH=12345,由于修改PATH的值后,命令的默认查找路径就变成了12345,所以此时输入 ls-l 或者其他命令当然是搜索不到的。

6、main函数中的三个参数是什么?

6.1、char *env[ ]

是环境变量。每个程序都会收到一张环境表(变量),环境表(变量)是一个字符指针数组,如下图二红框的env数组,每个指针指向一个以’\0’结尾的环境字符串,如下图一。

6.2、获取所有环境变量的三种方式

1.可以用上图二中的方式将所有环境变量打印出来。

2.用getenv函数获取某个指定的环境变量,函数在 stdlib.h头文件中。如下图为获取环境变量PATH的值。

3. 通过第三方变量environ获取。libc(即Linux下的c标准库)中的某个.c文件里定义的全局变量environ指向环境变量表, environ没有包含在任何头文件中, 所以在使用时要用extern声明,如下图:

6.3、char*argv[ ]

是命令行参数,比如在命令行输入ls -a -l,那么可执行程序ls中的main函数里的argv数组依次存储的就是ls和-a和-l这三个字符。用下图可执行程序pro做例子,在命令行中输入 ./pro 就会在shell界面打印黄框内容,输入./pro -a就会在shell界面打印红框内容,输入 ./pro -b就会在shell界面打印蓝筐内容。发现了没,这不正和 ls,ls -a,ls -l 如出一辙吗?事实上ls带不同选项显示不同内容也正是用这种方式实现的。        

6.4、 int argc

是命令行参数的个数,所以也是argv数组的大小。比如在命令行上输入指令ls -a -l,在可执行程序ls中的main函数里的argv数组依次存储的就是ls和-a和-l这三个字符,argc也就是3。

7、外壳程序shell自身的环境变量是从哪来的呢?(了解即可)

shell的环境变量是写在配置文件中的,shell启动的时候,通过读取配置文件获得的起始环境变量。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值