环境变量

                                                                环境变量

一.基本概念

  在Linux系统中,环境变量是存储配置信息的键值对,用于动态影响系统和程序的行为。

核心概念

1.作用:

  • 配置程序行为(如语言、路径、临时目录等)。
  • 定义用户工作环境(如默认编辑器、Shell类型)。

2. 作用域:

  • 全局变量:对所有用户和进程生效,通常通过系统级配置文件(如/etc/environment/etc/profile)设置。
  • 用户级变量:仅对当前用户生效,通过用户配置文件(如~/.bashrc~/.bash_profile)设置。
  • 临时变量:仅在当前Shell会话中有效,关闭终端后失效。

3. 继承性:

  • 子进程(如脚本、程序)会继承父进程的环境变量,但子进程的修改不会影响父进程。

二.查看环境变量方法 

echo $NAME //NAME:你的环境变量名称

eg:echo $PATH:系统查找可执行文件的路径列表

     echo $HOME:当前用户的主目录路径

三.常见环境变量

变量名 作用
PATH 系统查找可执行文件的路径列表
HOME 当前用户的主目录路径
USER 当前用户名,标明当前用户
SHELL 当前Shell的路径(如/bin/bash
LANG 系统语言和编码设置(如en_US.UTF-8
PWD 当前工作目录
PS1 Shell命令提示符的格式

PATH

PATH的作用

我们自己编写的可执行程序也可以算是一种命令,而我们运行这个命令还需要加上./程序名,也就是该程序的路径,为什么?

  当我们不加路径时,会出现command not found的报错,找不到该指令,所以需要加上程序的路径

而系统中的各个指令为什么就可以直接运行,而不需要路径呢?

  其实,系统指令也是需要需要路径的,只是当我们登录时,环境变量已经帮我们把指令的路径加载好了,我们可以通过路径加系统指令验证

                   

我们可以看到这两种方式运行的结果都是一样的,那系统指令的路径怎么设置的呢?我们可以直接查看系统变量中的路径

我们可以看到PATH早已把指令的路径配置好了。

此时我们提供两种方式(有很多方式)可以我们自己写的可执行文件不用再指明路径

  1. 将程序放入系统默认的 PATH 目录,这样虽然可以直接执行,但我们的代码未经检测,会污染系统的指令池
  2. 临时添加目录到 PATH(仅当前会话)
#export PATH=/home/chonbw/process/test   这样写是错误的,会导致PATH路径就剩下这个路径,会将其他路径全部覆盖,重新登录可解决
export PATH=$PATH:/home/chonbw/process/test   #路径之间使用冒号分隔开

ps:其中我们以前使用过的which指令也是根据PATH实现的

which是通过PATH来寻找指令所在的位置

PATH来源

系统通过这两个文件来为配置所有的环境变量,其中包括PATH

HOME

在linux使用echo $HOME会打印出该使用者的家目录

我们使用普通用户执行该指令打印出了当前的家目录,但为什么提权后打印的还是普通用户的家目录呢?

当你在终端中运行 sudo echo $HOME 时,Shell 会按以下步骤处理:

  1. 先解析变量:Shell 会先解析 $HOME,将其替换为 当前用户 的家目录(如 /home/username)。

  2. 再执行命令:将解析后的命令 sudo echo /home/username 提交给系统执行。

因此,sudo 实际执行的命令是 echo /home/username,与当前用户的 $HOME 无关。

USER

在linux使用echo $USER会打印出该使用者的名称 

USER 环境变量的最大意义是可以标识当前的使用linux用户

此处sudo的理由如上。

我们还可以使用代码来获取环境变量,用来判断身份

 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 int main()
  5 {
  6   char* who = getenv("USER"); //使用getenv函数来获取环境变量
  7   if(strcmp(who,"root") == 0)
  8   {
  9     printf("user: %s \n", who);
 10   }
 11   else
 12   {
 13     printf("权限不足! \n");
 14   }
 15   return 0;                                                                                                                                                                                                                      
 16 }
~

我们通过判断环境变量来获取身份,决定权限。USER是系统身份认证重要的一环

四.和环境变量相关的命令

命令

  1.  echo: 显示某个环境变量值
  2.  export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

我们自己也可以设置一些本地变量,可以直接定义

例如上述这种,我们可以直接定义,直接定义的变量相当于是本地变量,使用env根本查不到

对于已经存在的本地变量,我们可以使用export  变量名 将其变为环境变量

我们还可以使用代码来获取环境变量

 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define MY_ENV "myval"                                                                                                                                                                                                           
  5 int main()
  6 {
  7   char* my_env  = getenv(MY_ENV);
  8   if(my_env == NULL)
  9   {
 10     printf("%s,not found\n", MY_ENV);
 11     return 1;
 12   }
 13   printf("%s = %s \n",MY_ENV, my_env);
 14   return 0;
 15 }

总结

使用./myval               --bash就是一个系统进程,myval也会变成一个进程(fork),是bash的子进程  --环境变量具有全局属性  --是会被子进程继承下去(为什么要,为了不同场景  --让bash帮我找指令 路径,进行身份认证)

使用myval=abc         --本地变量     --只会在当前进程(bash)内有效

可见他简易的指令也是利用环境变量来实现的。

五.利用代码获取环境变量

命令行参数

命令行参数分别为int argc , char* argv[], char* env[]

我们知道了第二个参数可以接受外部传来的参数,我们可以试着写个框架出来

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

int main(int argc, char* argv[]) 
{
    if (argc != 2) {
        printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n", argv[0]);
        return 1;
    }

    // 检查第一个参数
    if (strcmp("-a", argv[1]) == 0) 
    {
        printf("功能a\n");
    } else if (strcmp("-b", argv[1]) == 0) 
    {
        printf("功能b\n");
    } else if (strcmp("-c", argv[1]) == 0) 
    {
        printf("功能c\n");
    } else if (strcmp("-ab", argv[1]) == 0) 
    {
        printf("功能ab\n");
    } else if (strcmp("-ac", argv[1]) == 0) 
    {
        printf("功能ac\n");
    } else if (strcmp("-bc", argv[1]) == 0) 
    {
        printf("功能bc\n");
    } else if (strcmp("-abc", argv[1]) == 0) 
    {
        printf("功能abc\n");
    } else 
    {
        printf("无效的参数: %s\n", argv[1]);
        printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n", argv[0]);
        return 1;
    }

    return 0;
}

通过代码获取环境变量

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

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

上述代码结果相同,都是调出所有的环境变量

总结

在本文中,获取环境变量的方法有三种

  • getenv
  • char *env[]
  • extern char **environ

推荐使用getenv来获取环境变量

posted @   chonbw  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示