Linux操作系统--环境变量

目录

基本概念:

常见环境变量:

查看环境变量的方法:

测试PATH

测试HOME

和环境变量相关的命令

环境变量的组织方式:​编辑

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

通过系统调用获取或设置环境变量

环境变量通常具有全局属性


基本概念:

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

常见环境变量:

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
  • SHELL:当前Shell,它的值通常时/bin/bash

查看环境变量的方法:

echo $NAME //NAME:环境变量的名字

测试PATH

1.创建hello.c文件

cpp 复制代码
#include<stdio.h>
  2 
  3 int main()
  4 {
  5     printf("hello world\n");
  6     return 0;
  7 }

2.对比./hello执行和直接hello执行

我们会疑惑,为什么可执行程序需要./才能执行可执行程序。但是Linux操作系统下一切皆文件,我们知道ls等指令也都是可执行文件,为什么不需要./ls?

这是因为Linux系统会在特定的目录中查找可执行文件。当你输入一个命令,比如ls,系统会根据环境变量PATH中指定的目录顺序来寻找对应的可执行文件。如果在PATH中能找到这个可执行文件,那么就可以直接运行,不需要加上路径。而当前目录不在PATH中,所以需要使用./来明确指定当前目录下的可执行文件。这是为了确保系统安全,避免意外执行不安全的可执行文件。

测试HOME

用root和普通用户,分别执行echo $HOME

和环境变量相关的命令

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

环境变量的组织方式:

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

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

命令行第三个参数,

(知识扩展:char *argv[]是一个参数数组,用于存储传递给一个程序的命令行参数。在C语言中,main函数通常有两个参数,分别是argc和argv。其中argc表示命令行参数的数量,argv是一个指向字符串数组的指针,每个字符串都是一个命令行参数。)

cpp 复制代码
1 #include<stdio.h>
    2 
    3 int main(int argc, char *argv[], char *env[])
    4 {
    5     int i = 0;
    6     for(;env[i];i++)
    7     {
    8         printf("%s\n",env[i]);                                                                                                  
    9     }
   10     return 0;
   11 }

通过第三方变量environ获取

cpp 复制代码
  1 #include<stdio.h>
  2 
  3 int main()
  4 {                                                                                                                                 
  5     extern char **environ;
  6     int i = 0;
  7     for(;environ[i];i++)
  8     {
  9         printf("%s\n",environ[i]);
 10     }
 11     return 0;
 12 }

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

通过系统调用获取或设置环境变量

使用getenv()函数,通过标准库函数直接获取环境变量

cpp 复制代码
#include <stdlib.h>
#include <stdio.h>
int main() {
    char *path = getenv("PATH");
    if (path != NULL)
        printf("PATH: %s\n", path);
    return 0;
}

putenv()函数

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 设置环境变量 MY_VAR=123
    if (putenv("MY_VAR=123") != 0) {
        perror("putenv failed");
        return 1;
    }
    // 获取验证
    char *val = getenv("MY_VAR");
    printf("MY_VAR: %s\n", val);  // 输出 MY_VAR: 123
    return 0;
}

修改已存在的环境变量

cpp 复制代码
putenv("MY_VAR=456");  // 覆盖原有值
printf("Updated MY_VAR: %s\n", getenv("MY_VAR"));  // 输出 456

删除环境变量

cpp 复制代码
putenv("MY_VAR=");     // 赋空值(部分系统有效)
putenv("MY_VAR");      // 直接移除(依赖具体实现)

环境变量通常具有全局属性

环境变量通常具有全局属性,可以被子进程继承下去

cpp 复制代码
1 #include <stdio.h>
    2 #include <stdlib.h>
    3 #include <unistd.h>
    4 
    5 int main() {
    6     // 设置全局环境变量(使用putenv)
W>  7     putenv("TEST_SCOPE=global");
    8 
    9     // 创建子进程执行命令(例如打印环境变量)
   10     if (fork() == 0) {
   11         // 子进程调用shell命令验证
   12         printf("子进程环境变量:%s\n",getenv("TEST_SCOPE"));                                                                    
   13     } else {
E> 14         wait(NULL); // 等待子进程结束
   15     printf("父进程环境变量:%s\n",getenv("TEST_SCOPE"));
   16     }
   17     return 0;
   18 }
相关推荐
xq5148631 小时前
Linux系统下安装mongodb
linux·mongodb
柒七爱吃麻辣烫1 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
孤寂大仙v1 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
深海蜗牛2 小时前
Jenkins linux安装
linux·jenkins
愚戏师2 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
JANYI20182 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
熊大如如3 小时前
Java NIO 文件处理接口
java·linux·nio
晚秋大魔王3 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
linux·开源·harmonyos
农民小飞侠3 小时前
ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint
linux·运维·ubuntu
某不知名網友3 小时前
Linux 软硬连接详解
linux·运维·服务器