【Linux】这篇文章让你彻底搞懂什么是环境变量

本文详细介绍了Linux环境变量的概念,包括PATH、HOME和SHELL的作用。PATH变量决定了命令的搜索路径,HOME存储用户主目录,SHELL揭示所用的命令行解释器。通过设置环境变量,用户可以自定义命令查找路径,理解命令行参数的本质,并通过代码获取环境变量。此外,还探讨了环境变量的查看、设置及局部变量与全局变量的区别。
摘要由CSDN通过智能技术生成

一、什么是环境变量

总述:
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息,总结就是环境变量存储了执行程序/命令要用到的有用信息
如何理解环境:
用户一般通过shell跟内核通信,对于Linux系统,具体的Shell就是bash,从而就有了bash环境,在bash环境中就会有很多默认的环境变量,例如PATH(存储指定命令的路径)。环境中除了有环境变量还有自定义变量。
如何理解变量:
变量就是可以随意给其赋值的一个存储单元,其作用要么是被赋值要么是被读取值

二、常见的环境变量

2.1 PATH

作用: PATH包含了指定命令的搜索路径,指定操作系统需要使用到的可执行程序的位置
思考:
1.为什么执行命令名如 ls 不用加“ ./ ”,但执行自己编译链接生成的可执行程序要“ ./

  • 原因是在系统PATH环境变量里面存储了很多条路径,当运行命令时会逐个在路径下找该命令,而ls,cd等指令已经被存储进PATH环境变量,故而无需加“ ./ ”,对于自己的可执行程序,并没有添加到环境变量中,所以需加“ ./ ”是通过相对路径指定在当前目录下才能被bash找到并运行

2.如何查看命令的路径?

  • ls为例,通过which lswhereis ls可查看ls命令路径
    在这里插入图片描述

3.如何查看PATH环境变量?

  • 通过echo $PATH可查看PATH环境变量
    在这里插入图片描述

4.如何让自己的程序执行时不用加“ ./
 1)将程序拷贝到/user/bin目录下,不推荐
   sudo cp -f myproc /user/bin
 2)用export将程序的路径添加到环境变量
   export PATH=$PATH:/home/yxy/mycodes
   意思是新的PATH=旧的PATH + 要添加的路径(/home/yxy/mycodes),这样当你运行你的程序时不用加“ ./ ”也可以让bash找到
 注意:当前所做的工作只是修改这变量,只对当前的shell有效,即使清空了也没事,重新登录后PATH会被恢复成原始态

2.2 HOME

作用: 存放当前用户的主工作目录(也称家目录)
演示:通过echo $HOME查看HOME变量

在这里插入图片描述
 可以看到:在普通用户时HOME变量显示的是当前用户的主工作目录,当切换为root账号时HOME变量显示的是root用户的主工作目录


2.3 SHELL

作用: 查看用户使用的是哪种命令行解释器
演示:通过echo $SHELL查看SHELL变量
在这里插入图片描述
 可以看到:用户使用的Shell解释器名称是bash


三、查看与设置变量

  • shell变量(局部变量):只在命令行设定(没有export)的变量叫局部变量,局部变量只在本进程(bash)内有效
  • 环境变量(全局变量):环境变量对创建它的Shell及其派生出来的子进程都有效,也即是说环境变量可以继承,从当前shell脚本执行的任何应用程序都会继承这个变量

如何设置局部变量: 通过 变量名=变量值 语句设定,如 MYVAL=100,注意=号之间不能有空格,否则shell会把变量名当成命令,变量名应该用大写字母
如何设置环境变量: 通过 export 变量名=变量值 语句设定,如 export MYVAL=100
查看变量:
  1. env 指令可以查看所有环境变量
  2. set 指令显示本地定义的shell变量和环境变量
清除环境变量: 通过 unset 变量名 语句设定,如 unset MYVAL

四、如何理解命令行带参

命令带参的本质: 是给main函数传递不同的参数使之执行不同的功能,main函数的参数分两种:命令行参数和环境变量,命令行参数使得main函数可以执行不同的功能,而系统会给所有进程传递环境变量
一个程序来说明:
在这里插入图片描述
该代码编译链接生成myproc可执行程序:
在这里插入图片描述
  注:./myproc运行可执行程序与执行ls,cd等命令本质是一样的,可通过将将程序的路径添加到环境变量则运行myproc时可不加“ ./

由此得出argv指针数组的布局:在这里插入图片描述

五、如何通过代码如何获取环境变量

envp数组:储存系统的环境变量信息,由系统提供,布局和argv指针数组一致
一个程序来说明:
在这里插入图片描述
该代码编译链接生成myproc可执行程序并执行:
在这里插入图片描述
结论:
  当程序跑起来变成了进程,该进程可获得环境变量 -> 也就是说:环境变量是一个系统级别的全局变量,bash之下的所有进程都可以获取
  为何系统级环境变量配置文件/etc/profile,/etc/environment中的声明的环境变量可以被所有进程访问到?是因为这些文件都是被init进程处理的, 而init进程是所有进程的祖先进程,这也就验证了子进程会继承父进程的环境变量,也可以理解为环境变量具有全局属性

程序中用其他方式获取环境变量:
 1. 可通过第三方变量environ获取:通过 extern char **environ ,libc中定义的全局变量environ指向环境变量表

	 extern char **environ;//第三方变量
     for(int i=0;environ[i];i++)
     {
         printf("environ[i]:%s\n",environ[i]);//environ[i]是不同的环境变量
     }

 2. 通过getenv(“变量名”)获取变量的内容

 #include<stdio.h>
 #include<stdlib.h>                                                              
 int main()                           
 {                                    
     printf("%s\n", getenv("PATH"));  
     return 0;                        
 }
  • 52
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值