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 目录被填满。
  • 程序依赖 :许多系统级程序依赖全局环境变量来获取运行时参数。
相关推荐
正在努力的小河5 小时前
Linux 自带的 LED 灯驱动实验
linux·运维·服务器
济南java开发,求内推5 小时前
Redis一个服务器部署多个节点
服务器·数据库·redis
Full Stack Developme5 小时前
Python Redis 教程
开发语言·redis·python
程序媛徐师姐5 小时前
Java基于SpringBoot的茶叶商城系统,附源码+文档说明
java·spring boot·java springboot·茶叶商城系统·java茶叶商城系统·茶叶·java茶叶商城
爱读源码的大都督6 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
Lucky_Turtle6 小时前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
檀越剑指大厂6 小时前
【Linux系列】Vim 中删除当前光标到行尾
linux·运维·vim
聪明的笨猪猪6 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.6 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http