Linux之环境变量



环境变量

一、什么是环境变量?

环境变量是一种动态的值,它存储在操作系统中,用于影响程序运行时的行为。它们就像系统中的"全局变量",在用户登录时或程序启动时被加载,并在运行过程中被程序引用。环境变量可以包含各种信息,比如文件路径、用户身份、语言设置等。

举个简单的例子,PATH 环境变量是一个非常重要的环境变量,它定义了系统在哪些目录中查找可执行文件。当你在终端输入一个命令时,系统会按照 PATH 中定义的顺序去查找这个命令的可执行文件。如果没有 PATH 环境变量,你可能每次都要输入完整的文件路径来运行一个程序,这显然是非常不方便的。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

二、常见的环境变量

(一)PATH

PATH 是最常用的环境变量之一。它是一个由冒号分隔的目录列表,系统会按照这个顺序在这些目录中查找可执行文件。例如,当你输入 ls 命令时,系统会在 PATH 中定义的目录中查找 ls 的可执行文件。

你可以通过以下命令查看当前的 PATH 值:

bash 复制代码
echo $PATH

如果你需要添加一个新的目录到 PATH 中,可以通过以下命令(以添加 /usr/local/bin 为例):

bash 复制代码
export PATH=$PATH:/usr/local/bin

这个命令会将 /usr/local/bin 添加到 PATH 的末尾。不过需要注意的是,这种修改只对当前终端会话有效。如果你希望永久修改 PATH,需要将其添加到用户的配置文件中,比如 ~/.bashrc~/.profile

(二)HOME

HOME 环境变量指向当前用户的主目录。对于大多数用户来说,HOME 的值是 /home/username,其中 username 是你的用户名。这个变量在很多场景中都非常有用,比如当你在脚本中需要引用用户的主目录时,可以直接使用 $HOME,而不需要硬编码具体的路径。

例如,你可以通过以下命令快速切换到自己的主目录:

bash 复制代码
cd $HOME

(三)SHELL

SHELL 环境变量表示当前用户使用的默认 shell。在 Linux 系统中,常见的 shell 有 bashzshdash 等。通过查看 SHELL 的值,你可以知道系统为你分配了哪种 shell。

你可以通过以下命令查看当前的 SHELL 值:

bash 复制代码
echo $SHELL

如果你想要切换到其他 shell,可以通过 chsh 命令(change shell)来修改默认 shell。

三、查看和修改环境变量

(一)查看环境变量

你可以通过以下命令查看当前所有的环境变量:

bash 复制代码
env

或者使用 printenv 命令:

bash 复制代码
printenv

如果你想查看某个特定环境变量的值,可以直接使用 echo 命令,比如:

bash 复制代码
echo $PATH

(二)修改环境变量

修改环境变量可以通过 export 命令来完成。例如,修改 PATH

bash 复制代码
export PATH=$PATH:/new/path

如果你需要修改一个变量的值,可以直接覆盖它。比如:

bash 复制代码
export EDITOR=nano

需要注意的是,这种修改只对当前终端会话有效。如果你希望永久修改环境变量,需要将修改命令添加到用户的配置文件中,比如 ~/.bashrc~/.profile。然后,你需要重新加载配置文件,或者重新登录用户,才能使修改生效。

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

  • 查看环境变量printenv env echo
  • 设置环境变量export
  • 删除环境变量unset
  • 持久化环境变量 :修改配置文件(如 ~/.bashrc/etc/environment)并使用 source 命令重新加载
  • 其他相关命令settypesetdeclare

一、查看环境变量

  1. printenv
    printenv 命令用于显示当前环境变量的内容。它可以显示所有环境变量,也可以指定显示某个特定的环境变量。
  • 显示所有环境变量

    bash 复制代码
    printenv

    这个命令会列出当前环境中所有的键值对。

  • 显示特定环境变量

    bash 复制代码
    printenv PATH

    这个命令会显示 PATH 环境变量的值。

  1. env
    env 命令用于显示当前环境变量,也可以用于运行程序时临时设置环境变量。
  • 显示所有环境变量

    bash 复制代码
    env

    这个命令与 printenv 类似,会列出当前环境中所有的键值对。

  • 运行程序时设置环境变量

    bash 复制代码
    env VAR=value command

    例如:

    bash 复制代码
    env JAVA_HOME=/usr/lib/jvm/java-8-openjdk java -version

    这个命令会临时设置 JAVA_HOME 环境变量,并运行 java -version 命令。

  1. echo
    echo 命令用于显示变量的值,通常与 $ 符号一起使用来获取环境变量的值。
  • 显示特定环境变量

    bash 复制代码
    echo $PATH

    这个命令会显示 PATH 环境变量的值。

二、设置和修改环境变量

  1. export
    export 命令用于在当前终端会话中设置环境变量。它将变量导出为环境变量,使其对当前会话中的所有子进程都可用。
  • 临时设置环境变量

    bash 复制代码
    export VAR=value

    例如:

    bash 复制代码
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk

    这个命令会将 JAVA_HOME 设置为 /usr/lib/jvm/java-8-openjdk,并且在当前终端会话中有效。

  • 将变量添加到 PATH

    bash 复制代码
    export PATH=$PATH:/new/path

    这个命令会将 /new/path 添加到 PATH 环境变量中。

  1. unset
    unset 命令用于删除环境变量,使其不再可用。
  • 删除环境变量

    bash 复制代码
    unset VAR

    例如:

    bash 复制代码
    unset JAVA_HOME

    这个命令会删除 JAVA_HOME 环境变量。

三、其他相关命令

  1. set
    set 命令用于显示当前 shell 的所有变量和函数定义。它不仅显示环境变量,还会显示局部变量和函数。
  • 显示所有变量和函数

    bash 复制代码
    set
  1. typeset
    typeset 命令用于声明变量的类型,并可以设置变量的属性。它在某些 shell(如 kshbash)中可用。
  • 声明变量类型

    bash 复制代码
    typeset -x VAR=value

    这个命令会将变量 VAR 声明为环境变量。

  1. declare
    declare 命令与 typeset 类似,用于声明变量的类型和属性。它主要用于 bash shell。
  • 声明变量类型

    bash 复制代码
    declare -x VAR=value

    这个命令会将变量 VAR 声明为环境变量。

六.环境变量的组织方式

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

七.环境变量的全局属性

1. 定义

全局环境变量是系统范围内的变量,它们的值对所有用户和所有进程都有效。这些变量通常在系统启动时初始化,并且可以通过修改系统配置文件来设置或修改。

2. 作用

  • 统一配置 :全局环境变量可以为系统中的所有用户和程序提供统一的配置信息。例如,PATH 环境变量定义了系统查找可执行文件的路径,通过全局设置可以确保所有用户都能访问到相同的命令路径。
  • 资源管理 :全局环境变量可以用于管理系统的资源分配。例如,TMPDIR 可以指定全局的临时文件存储位置,避免默认的 /tmp 目录被填满。
  • 程序依赖 :许多系统级程序依赖全局环境变量来获取运行时参数。
相关推荐
LiLiYuan.几秒前
【happens-before 八大规则详解】
java·开发语言
小L写Java12 分钟前
第六章:JVM 调优实战 —— GC日志分析、内存溢出排查与线上问题定位
java·jvm
用户23678298016812 分钟前
Linux iptables 深度解析:从规则匹配到 NAT 转发实战
linux
SuniaWang15 分钟前
《AgentX 专栏》08-工作流引擎:AgentWorkflow怎么把工具记忆流程串成一条流水线
java·ai·架构·langchain·工作流引擎·langgraph·agent架构
夜白宋17 分钟前
【Redis深入】一、快的原因
数据库·redis·缓存
SXJR27 分钟前
langchain4j是如何保证tools或者funcation call不出错的
java·网络·数据库·ai·语言模型
CairBin31 分钟前
SideSail——Ubuntu 26.04(GNOME 50)侧边栏插件,支持设备信息剪贴板和米家设备简单控制
linux·ubuntu
子一!!35 分钟前
spring基础学习
java·学习·spring
howard200535 分钟前
3.4 Linux目录操作
linux·目录操作
拽着尾巴的鱼儿40 分钟前
Java 对象的深拷贝和浅拷贝
java·开发语言