【Linux】环境变量

简介: 环境变量

@TOC

0. 引入

众所周知,命令、程序、工具...本质上都是可执行的文件。我执行自己的程序时,需要带./,是为了找到对应的程序。

<img src=" title="">

那为什么系统的命令可以直接执行,而不用带路径呢?那是因为环境变量(这里是PATH:指定命令的搜索路径)

:yellow_heart: 查看环境变量

echo $NAME  [NAME:环境变量名]

可以看到,环境变量PATH以:作为分隔符,分隔出多条路径,执行系统命令时,会从左向右依次查找,直至找到。

<img src=" title="">

:yellow_heart:那么,怎么样使我们自己的可执行程序不带路径就能直接执行呢?

  1. 把命令(我们自己写的可执行程序也可以看做是某种命令) 拷贝到环境变量PATH的某一路径下

    严重不推荐,因为会污染命令池。现在我们知道,所谓的安装软件,就是把软件拷贝到系统环境的某一特定路径下。

  2. 把我们的当前路径添加到环境变量PATH中

    export PATH=$PATH:当前路径  导环境变量

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fy4b7msk-1648263953117)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220324212401349.png)] 这里设置的是内存级的环境变量,并没有写入到系统文件中,关闭xshell也会释放掉。

1. 概念(重要)

1.1 环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数具有某些特殊用途的系统级变量。

:yellow_heart: 常见的环境变量

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

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PccFTxiv-1648263953118)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220324214043641.png)]

  • SHELL : 当前Shell版本,它的值通常是/bin/bash。

    <img src=" title="">

:yellow_heart: 一系列环境变量相关指令

echo    显示某个环境变量值
export    设置一个新的环境变量
env        显示所有环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NN1XhTxd-1648263953119)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220324215313822.png)]

1.2 本地变量

:heart: 系统中还存在着一种变量,叫做本地变量,是与本次登陆(session会话)有关的变量,只在本次登陆有效。

set        显示本地或环境变量
unset    清除本地或环境变量

<img src=" title="">

这个环境变量没有写到配置文件中,关闭xshell会释放掉。不过我们现在所谈的环境变量都是系统级的。

<img src=" title="">

2. 查看环境变量

众所周知,main函数是可以携带参数的,传递命令行参数。

#include<stdio.h>    
    
int main(int argc,char* argv[])    
{    
   for(int i = 0;i<argc;i++)    
   {    
     printf("argv[%d]->%s\n",i,argv[i]);                                                                                                           
   }    
   return 0;    
}
  • argc:限定命令行字符串个数
  • argv:指针数组

<img src=" title="">

:yellow_heart: 那么命令行参数有什么意义呢?

众所周知,指令有很多选项,用来完成同一个命令不同子功能。选项底层就是通过命令行参数实现的 ——

<img src=" title="">

我们可以通过给同一个程序带入不同参数的方式,呈现出不同的功能。比如下面这段程序,就可以通过输入不同选项,输出不同的结果。

#include<stdio.h>    
#include<string.h>    
    
int main(int argc,char* argv[])    
{    
  if(argc != 2)    
  { 
    // 限定传两个命令行参数,否则打印如下错误信息
    printf("Usage:%s-[a|b]\n",argv[0]);                                                                         return 1;    
  }    
  if(strcmp(argv[1],"-a")==0)    
    printf("hello a4\n");    
  else if(strcmp(argv[1],"-b")==0)    
    printf("hello beatles\n");    
  else    
    printf("hello\n"); //默认
}

运行结果 ——

<img src=" title="">

2.1 通过代码

命令行的第三个参数 & 第三方变量environ。

1.命令行的第三个参数

main函数除了可以传递命令行参数,还可以传递环境变量env.

⛄️ 环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以\0结尾的环境变量字符串。

<img src=" title="">

于是我们就可以用程序来获取环境变量 ——

#include<stdio.h>    
#include<string.h>    

int main(int argc,char* argv[],char* env[])    
{
    for(int i = 0; env[i]; i++)    
    {    
      printf("%d->%s\n",i,env[i]);    
    }    
    return 0; 
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yd4NdPua-1648263953119)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220325202130951.png)]

2.第三方变量environ

environ是系统默认提供的第三方变量,类型char**,指向环境表的起始地址。

#include<stdio.h>    
#include<string.h>    
    
int main()    
{    
  extern char** environ;                                                                                                                  
  for(int i = 0;environ[i];i++)    
  {    
    printf("%s\n",environ[i]);    
  }
  return 0;
}

environ是系统提供的外部指针,编译时自动制定好环境变量的位置,从而获取环境变量 ——

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XWhdze8a-1648263953120)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220325204230135.png)]
然而,以上两种方式极极极不常用,只是为了说明环境变量是可以传到程序里的,了解即可。

2.2 getenv

:heart: 可以通过环境变量名获取环境变量内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMev9vgG-1648263953120)(C:\Users\13136\AppData\Roaming\Typora\typora-user-images\image-20220325210631270.png)]

#include<stdio.h>    
#include<stdlib.h>    
    
int main()    
{    
  printf("%s\n",getenv("PATH"));    
  printf("%s\n",getenv("HOME"));    
  printf("%s\n",getenv("SHELL"));                                                                                                                  
  return 0;
}

我们拿着变量名,找到环境变量,再拿到变量中内容 ——
<img src=" title="">
即便如此,我们也不会没事儿去获取环境变量,但是这个概念非常重要。

3. 环境变量具有全局属性

:heart: 环境变量具有全局属性本质是因为环境变量可以被子进程继承的。

#include<stdio.h>    
#include<unistd.h>    

int main()    
{    
  printf("I am a process.pid:%d,ppid:%d\n",getpid(),getppid());    
  return 0;
}

多跑几遍,可以看到我的PID一直在变,因为进程子在不断新建,但PPID保持不变,而它的父进程就是-bash,即命令行解释器。命令行上启动的进程,父进程都是bash(fork).

<img src=" title="">

那么怎么证明环境变量具有全局属性呢?在myproc中写如下一段代码

#include<stdio.h>      
#include<stdlib.h>      
      
int main()      
{      
  printf("my_env_string:%s\n",getenv("my_env_string"));                                                                                            
  return 0;      
}

<img src=" title="">

环境变量,影响了整个“用户”系统 ——

<img src=" title="">

持续更新~@边通书

相关文章
|
13天前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
|
18天前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
12 3
|
3天前
|
存储 Java Linux
Linux环境变量配置及常见问题解决方案
Linux环境变量配置及常见问题解决方案
|
5天前
|
Linux Shell 数据处理
深入了解Linux的printenv命令:环境变量的查看与解析
`printenv`命令在Linux中用于查看环境变量,它显示所有或特定变量及其值。该命令简单易用,可结合参数实现过滤和筛选,如 `-0` 用于null分隔,`-n` 只列名称,`-u` 查找未设置的变量。通过与`grep`等结合,能进行复杂查询。在使用时要注意保护敏感信息,并理解变量对系统和程序的影响。定期检查和管理环境变量能提升系统效能和安全性。
|
6天前
|
Linux Shell 调度
【linux】环境变量
【linux】环境变量
9 0
|
29天前
|
Linux Shell
26. 【Linux教程】Linux 查看环境变量
26. 【Linux教程】Linux 查看环境变量
32 1
|
12天前
|
存储 搜索推荐 Linux
linux设置环境变量
linux设置环境变量
|
2月前
|
存储 Unix Shell
Linux:环境变量
Linux:环境变量
33 7
|
29天前
|
Linux Shell
28. 【Linux教程】删除环境变量
28. 【Linux教程】删除环境变量
22 0
|
29天前
|
Shell Linux 网络安全
27. 【Linux教程】配置环境变量
27. 【Linux教程】配置环境变量
19 0