初识环境变量

初识环境变量

目录

  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 编译程序时,环境变量主要起到配置应用程序设置系统路径的作用。

相关推荐
Lovyk1 小时前
Linux 正则表达式
linux·运维
Fireworkitte2 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9002 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char2 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
淮北也生橘124 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
华强笔记7 小时前
Linux内存管理系统性总结
linux·运维·网络
十五年专注C++开发8 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
phoenix09818 小时前
ansible部署lnmp-allinone
linux·运维·ansible
winds~9 小时前
【git】 撤销revert一次commit中的某几个文件
linux·c++
iY_n9 小时前
Linux网络基础
linux·网络·arm开发