【Linux】环境变量

简介: 【Linux】环境变量

一、伏笔


我们所写的命令,程序,工具…本质都是可执行文件,我执行自己的程序时,需要带./,是为了确定路径找到对应的程序


0a2653c851af460fa595bd959398a8f1.png


为什么执行系统命令的时候就不用带路径呢?这里其实就是环境变量的作用了


环境变量的本质是操作系统在内存/磁盘文件中开辟的空间,用来保存系统相关的数据!


⚡查看环境变量


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


看到下图,环境变量PATH以:作为分隔符,分隔出多条路径,执行时会从左向右依次查找,直至找到为止

2d65d23f6d4748949b924e4057485923.png

而我们不能直接运行自己的程序时,是因为当前所处的路径不在环境变量所维护里

那么问题来了:


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


1️⃣:把可执行程序拷贝在环境变量PATH的某一路径下(不推荐)因为会污染命令池❗


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


export PATH=$PATH:当前路径  

0a2653c851af460fa595bd959398a8f1.png

更改环境变量,只对本次登录有效,只要不动配置文件,咋搞都没问题


在windows下也有环境变量


2d65d23f6d4748949b924e4057485923.png


二、概念


🌈 环境变量


环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数


✨常见的环境变量


PATH:指定命令的搜索路径


HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的家目录)


0a2653c851af460fa595bd959398a8f1.png


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


2d65d23f6d4748949b924e4057485923.png


✨ 一系列环境变量相关指令


echo: 显示某个环境变量值

export: 设置一个新的环境变量


env  显示所有环境变量


6de278e6d6694ce5bb08e7e842b7e74b.png


测试HOME——测试root和普通用户的工作目录


8ec4f2997fb246878c34ecd6d122b7c6.png


🌈 命令行局部变量


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


set  显示本地或环境变量

unset 清除本地或环境变量


0a2653c851af460fa595bd959398a8f1.png


由于我们没有修改配置文件,所以我们咋搞都无所谓,大不了重启xshell


三、查看环境变量


我们知道,main函数是可以携带3个参数的,传递命令行参数


argc:命令行字符串的个数

argv:指针数组

#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;    
}

0a2653c851af460fa595bd959398a8f1.png

那么命令行参数意义在哪呢?

我们知道命令是带有很多选项的,完成一个命令的不同子功能。选项底层就是通过命令行参数实现的


2d65d23f6d4748949b924e4057485923.png


我们还可以通过给同一个程序带入不同参数的方式,呈现出不同的功能


int main(int argc, char *argv[], char *env[])                                 
 {
   if(argc != 2)
   {
     printf("Usage: %s 至少有一个选项\n",argv[0]);
     return 1;
   }                                                              
   if(strcmp("-a", argv[1]) == 0)                               
   {                                                     
     printf("这是功能一\n");         
   }                                                   
   else if(strcmp("-b",argv[2]) == 0)        
   {
     printf("这是功能二\n");
   }


🔥 代码查看

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


1️⃣命令行的第三个参数


main函数可以传递环境变量env


🔥 环境变量的组织方式

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

0a2653c851af460fa595bd959398a8f1.png

环境变量被当成字符串的形式,以指针数组的方式被保存


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


#include<stdio.h>  
#include<stdlib.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; 
}


2️⃣:通过第三方变量environ获取


通过查看man手册知道


0a2653c851af460fa595bd959398a8f1.png


environ是系统默认提供的第三方变量,类型char**,指向环境表的起始地址,本质上和第一种一样


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


libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明


以上两个方式极其不常用,只是为了说明环境变量是可以传到程序里的,知道就好几乎不会用,致命的缺点:把环境变量当成字符串


🔥 getenv(实用)

💫可以通过环境变量名,来获取环境变量的内容


0a2653c851af460fa595bd959398a8f1.png


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


这种方法用的最多


0a2653c851af460fa595bd959398a8f1.png


四、环境变量具有全局属性


那我们有想过,环境变量是咋来的呢?

答:从父进程继承得来,慢慢追溯到bash,甚至操作系统


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


#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).


0a2653c851af460fa595bd959398a8f1.png


那么怎么证明环境变量具有全局属性呢?


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


最后执行命令是,打印出来环境变量,bash给我们创建子进程,./myproc为子进程,也就证明了:


子进程继承了环境变量

子进程的环境变量是从父进程来的,追溯到bash

好比一颗多叉树,bash开了一堆环境变量,后面所有的子进程都要继承


所以环境变量具有全局属性❗


📢写在最后


能看到这里的都是棒棒哒🙌!

想必权限也算是Linux中重要🔥的部分了,如果认真看完以上部分,肯定有所收获。

接下来我还会继续写关于📚《地址空间》等…

💯如有错误可以尽管指出💯

🥇想学吗?我教你啊🥇

🎉🎉觉得博主写的还不错的可以`一键三连撒🎉🎉


相关文章
|
5月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
23天前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
39 4
|
5月前
|
Java Linux
linux 对子用户配置java 环境变量
linux 对子用户配置java 环境变量
43 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系统非常重要。
272 2
|
6月前
|
关系型数据库 MySQL Shell
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
【权限提升】Linux系统&环境变量&定时任务&权限配置不当&MDUT自动化
108 4
|
6月前
|
Linux Shell 编译器
Linux进程——Linux环境变量
Linux进程——Linux环境变量
46 3
|
5月前
|
Java Linux Shell
【Linux】深度解剖环境变量
【Linux】深度解剖环境变量
43 0