初识环境变量

初识环境变量

目录

  1. 什么是环境变量
  2. 常见的环境变量
  3. Linux中与环境变量的有关的命令
  4. 如何获取环境变量
  5. 环境变量的特点
  6. 环境变量的作用

1.什么是环境变量

我们在Linux操作系统下,使用指令,比如ls,pwd,cd等等,可以直接使用,但是我们编译完C/C++文件后产生的test可执行程序,我们却需要输入./test才能运行,我们加了一个路径才让程序跑起来,而平时的操作指令却不需要加路径,为什么?

  • 这是环境变量中的PATH在搞鬼

概念环境变量(Environment Variables)是操作系统用于存储配置信息的变量,这些信息可以影响系统和应用程序的行为。

又比如我们在编译C/C++文件时,我们并没有输入动/静态库的位置,但还是编译成功,原因是有相关环境变量帮助编译器进行查找。

2.常见的环境变量

  • PATH:指定操作系统查找可执行文件的目录列表。
  • HOME:当前用户的主目录路径。
  • USER:当前登录用户的用户名。
  • SHELL:默认的命令行解释器(shell)路径。
  • PWD:当前工作目录路径。
  • LANG / LC_ALL:设置系统的默认语言和区域,影响应用程序的本地化显示。
  • TEMP / TMP:系统临时文件存储路径,程序可在此创建临时文件。

3.Linux中与环境变量的有关的命令

  1. export

    • 用途:设置一个新的环境变量或将一个本地变量变为环境变量,使其在当前 shell 会话的子进程中可用。

    • 用法export VAR_NAME=value

      bash 复制代码
      export PATH="$PATH:/new/path"	#在PATH环境变量下新增路径,需要带上旧的PATH,不然PATH将只有新的路径
      export MY_VAR="Hello"

    本地变量是什么?

    bash 复制代码
    MY_VAR="Hello" 			#不加export,此时的MY_VAR就是本地变量
    export MY_VAR="Hello" 	#MY_VAR此时是就是临时的环境变量(仅对当前会话有效)
  2. echo

    • 用途:显示环境变量的值。

    • 用法echo $VAR_NAME

      bash 复制代码
      echo $PATH
      echo $USER
  3. env

    • 用途:显示当前 shell 会话中的所有环境变量。也可以用于在临时设置环境变量的情况下执行一个命令。

    • 用法

      bash 复制代码
      env             # 显示所有环境变量
      env VAR=value command  # 在特定环境变量设置下执行命令

      示例:

      bash 复制代码
      env PATH=/tmp ./myprogram
  4. printenv

    • 用途:显示指定环境变量的值。如果不指定变量名,则显示所有环境变量。

    • 用法

      bash 复制代码
      printenv PATH
      printenv          # 显示所有环境变量
  5. set

    • 用途:显示所有 shell 变量,包括环境变量和本地变量。也可以用来设置本地变量(但不默认导出为环境变量)。

    • 用法

      bash 复制代码
      set              # 显示所有变量
      set VAR=value    # 设置一个本地变量
  6. unset

    • 用途:删除一个变量(环境变量或本地变量)。

    • 用法unset VAR_NAME

      bash 复制代码
      unset MY_VAR	

4.如何获取环境变量

  1. 使用 Shell 命令获取环境变量

  2. 从配置文件中获取

    在 Linux 系统中,环境变量可以通过读取用户或系统配置文件获取,例如:

    • /etc/environment:全局环境变量配置文件,影响系统中的所有用户。
    • ~/.bashrc~/.bash_profile~/.profile:用户特定的配置文件,在用户登录时加载。
  3. 编程语言中获取环境变量,这里只讨论C语言

    • 通过系统调用 获取-->getenv

      C 复制代码
      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
           printf("%s\n", getenv("PATH"));
           return 0;
      }
    • 命令行第三个参数

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

      对于main函数居然有三个参数,我是很震惊的,因为已经学了一年C/C++了,才知道。

      1. int argc(Argument Count):

        • 表示命令行参数的个数,包括程序本身的名称。
        • argc 的值至少为 1,因为第一个参数是程序的名称。

        例如,如果运行 ./myprogram arg1 arg2,则 argc 的值为 3。

      2. char *argv[](Argument Vector):

        • 一个字符串数组,包含所有命令行参数。
        • argv[0] 是程序的名称或路径,argv[1]argv[argc - 1] 是用户传递的参数。
        • argv 的最后一个元素通常是一个空指针(NULL),表示参数列表的结束。

        在前面的例子中,argv[0]./myprogramargv[1]arg1argv[2]arg2

      3. char *envp[](Environment Pointer):

        • 环境变量的字符串数组(通常不常见于标准 C,但在某些编译器和系统中支持)。
        • 每个元素都是一个以等号 = 分隔的字符串,形式为 "KEY=VALUE"
        • envp 的最后一个元素通常是一个空指针(NULL),表示环境变量列表的结束。

        通过 envp,程序可以直接访问调用它时的所有环境变量。需要注意的是,使用 envpmain 函数通常定义为 int main(int argc, char *argv[], char *envp[])

    • 通过第三方变量environ获取

      C 复制代码
      #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;
      }
      • environ 是一个特殊的全局变量,它指向环境变量的数组。
      • environ没有包含在任何头文件中,所以在使用时 要用extern声明。
      • 在 Linux 和 Unix 系统中,environ 数组的最后一个元素为 NULL,表示环境变量列表的结束。

5.环境变量的特点

  • 继承性:父进程可以将其环境变量传递给子进程,子进程会继承父进程的环境变量副本。

    本地变量:没有继承性

  • 临时性 :在命令行会话中设置的环境变量仅对当前会话有效。永久更改环境变量需要将其添加到系统或用户的环境配置文件中(如 .bashrc.profile 或 Windows 系统变量设置)。

  • 大小写敏感:在 Linux 和 Unix 系统中,环境变量名称区分大小写,而在 Windows 中则不区分大小写。

6.环境变量的作用

  1. 配置应用程序:许多应用程序通过读取环境变量获取其配置参数,比如数据库连接信息、API 密钥、以及调试模式等设置。

  2. 设置系统路径 :环境变量 PATH 列出操作系统查找可执行程序的目录路径。系统在运行命令时,会按照 PATH 中定义的目录顺序查找对应的可执行文件。

    意味着当我们将test加入到的绝对路径加入到PATH后,那么我们就可以直接使用test指令。

  3. 用户信息与系统设置 :环境变量还存储当前用户的相关信息(如 HOMEUSER 等),以及系统的临时目录路径(如 TEMPTMP)。

  4. 传递配置信息:环境变量为父进程向子进程传递配置信息提供了一个简便的方式。在运行进程时,操作系统会将当前环境变量复制到该进程中,使进程能直接读取这些变量。

在使用 gcc 编译程序时,环境变量主要起到配置应用程序设置系统路径的作用。

相关推荐
pk_xz1234562 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面6 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq6 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮7 小时前
Linux 使用中的问题
linux·运维
dsywws8 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零9 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程10 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬11 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节