环境变量
字数: 2881 字 时长: 11 分钟
在 Linux 操作系统中,环境变量(Environment Variables)是一组动态存储的值,它们定义了用户或系统的行为和配置。环境变量可以被操作系统、程序或用户会话读取和修改,从而影响程序的运行方式。Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。
环境变量的主要作用:
- 配置环境:环境变量用于定义系统和应用程序的运行环境。例如,PATH 环境变量指定了系统搜索可执行文件的目录列表,而 LANG 或 LANGUAGE 变量定义了默认的语言和字符编码,影响程序的本地化行为。
- 传递信息:环境变量在程序、服务和脚本之间传递重要的配置信息。除了 HOME 变量指示当前用户的主目录外,USER 和 LOGNAME 变量传递当前用户的用户名,而 TMPDIR 变量指定了用于存放临时文件的目录。
- 控制程序行为:环境变量可以改变程序的行为和功能。例如,许多程序会检查 DEBUG 或 VERBOSE 环境变量来决定是否输出调试信息。此外,DISPLAY 环境变量在图形界面程序中用于指定 X 服务器的连接信息。
- 系统状态:某些环境变量反映了系统的当前状态或配置。例如,SHELL 变量显示当前用户正在使用的 shell,而 PWD 变量代表当前工作目录的路径。
可以使用 env
命令来查看当前系统中的环境变量,执行命令如下:
[root@localhost ~]# env
SHELL=/bin/bash
HISTCONTROL=ignoredups
HISTSIZE=1000
HOSTNAME=localhost
PWD=/root
LOGNAME=root
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/root
LANG=C.UTF-8
……
Linux 系统的正常运行和为用户提供服务依赖于数百个环境变量的协同工作。这些变量在操作系统和应用程序的运行中扮演着重要角色,从配置系统环境到传递关键信息,再到控制程序行为,它们的功能覆盖了操作系统的各个方面。
然而,对于大多数用户来说,没有必要逐一学习每个环境变量的具体细节。环境变量的设计初衷是为了简化系统管理,提高应用程序的灵活性和可移植性,而不是要求用户成为环境变量的专家。大多数标准环境变量都已经由系统默认配置好了,能够满足日常使用的需求。
只有在特定的应用场景或在进行系统级别的开发和调试时,用户才可能需要关注和修改这些环境变量。例如,开发者在配置特定的开发环境,或者系统管理员在优化系统性能时,可能会用到一些特定的环境变量。
对于普通用户而言,了解一些常用的环境变量,如 PATH、HOME、LANG 等,通常就足够了。这些变量直接关系到用户的日常操作和多语言支持。而对于更专业的使用场景,可以查阅相关的文档或资源,以获取必要的信息和指导。
变量名称 | 含义 |
---|---|
PATH | 与 windows 环境变量 PATH 功能一样,设置命令的搜索路径,以冒号为分割。 |
HOME | 当前用户主目录。 |
SHELL | 当前 Shell 解析器类型。 |
HISTFILE | 显示当前用户执行命令的历史列表文件。 |
PWD | 显示当前所在路径。 |
OLDPWD | 显示之前的路径。 |
HOSTNAME | 显示当前主机名。 |
HOSTTYPE | 显示主机的架构,是 i386、i686、还是 x86、x64 等。 |
LANG | 设置当前系统语言环境。 |
PS1 | 定义命令行的提示符的,可以按照自己的需求来定义自己喜欢的提示符。 |
环境变量分类
在 Linux 操作系统中,环境变量根据其作用范围主要分为两大类:系统级环境变量和用户级环境变量:
- 系统级环境变量:指那些在全局配置文件中定义的变量,它们对系统中的所有用户和 Shell 程序都是可见的。这些变量通常存储在如
/etc/environment
、/etc/profile
或/etc/bash.bashrc
等文件中。当系统启动或用户登录时,这些全局环境变量被加载进 Shell 环境,从而为所有用户和进程提供一致的配置。例如,PATH 变量通常在系统级定义,以确保所有用户都能访问系统命令。 - 用户级环境变量:指那些在个人配置文件中定义的变量,它们仅对当前用户的 Shell 程序可见。这些变量通常存储在用户的家目录中的配置文件里,如
.bashrc
、.bash_profile
或.profile
。用户级环境变量允许每个用户自定义自己的工作环境,例如,通过设置 EDITOR 变量来指定默认文本编辑器,或者通过 LANG 变量来设置语言偏好。
Linux 作为一个多用户多任务的操作系统,为每个用户提供了独立的、个性化的工作运行环境。这意味着,根据用户身份的不同,某些环境变量可能会有不同的值。例如,可以通过以下命令来查看 HOME 环境变量在不同用户身份下的值:
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# su user1
[user1@localhost ~]$ echo $HOME
/home/user1
NOTE
su
命令用于临时切换用户身份。
环境变量通常由一个固定的变量名和用户或系统设置的变量值组成。所以可以创建自定义的环境变量以简化日常操作。例如,为了更方便地进入一个层次较深的目录,可以设置一个名为 WORKDIR 的环境变量:
[root@localhost ~]# mkdir /opt/work1
[root@localhost ~]# WORKDIR=/opt/work1
[root@localhost ~]# cd $WORKDIR
[root@localhost work1]# echo $PWD
/opt/work1
然而,需要注意的是,这样的环境变量默认不具备全局性,其作用范围有限,且不能被其他用户直接使用。如果需要使这个环境变量全局有效,以便其他用户也能使用它,可以将其设置为全局环境变量:
[root@localhost work1]# su user1
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost ~]$ echo $WORKDIR
上述操作会失败,因为 WORKDIR 尚未对 user1 用户定义。为了解决这个问题,要将 WORKDIR 设置为全局环境变量,以便所有用户都能访问,需要将 WORKDIR 的定义添加到全局环境变量配置文件中,例如 /etc/environment
或 /etc/profile
:
[root@localhost ~]$ echo "WORKDIR=/home/work1" > /etc/environment
[root@localhost work1]# su user1
[user1@localhost ~]# cd $WORKDIR
[user1@localhost work1]#
/opt/work1
通过这种方式,可以让自定义的环境变量在系统范围内对所有用户有效。
NOTE
/etc/environment
文件是 Linux 系统中用于定义系统级环境变量的标准文件,以存储全局环境变量。
PATH 环境变量
PATH 环境变量在 Linux 系统中扮演着非常重要的角色。它是一个字符串,由多个目录路径组成,用于指定系统搜索可执行文件的顺序。当用户在命令行中输入一个命令时,Shell(如 Bash)会按照 PATH 环境变量中列出的目录顺序去搜索对应的可执行文件。
PATH 环境变量通常由一系列的目录路径组成,各个路径之间用冒号(:
)分隔。例如:
[root@localhost ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
/root/.local/bin
:这是用户根目录下的 .local 目录中的 bin 目录。这通常是一个用户特定的目录,用于存放用户安装的可执行文件。/root/bin
:这是 root 用户的主目录下的 bin 目录。它允许 root 用户在该目录中放置私人的可执行文件。/usr/local/sbin
:这是一个系统级的目录,通常用于存放本地安装的系统管理(管理员)程序。/usr/local/bin
:这是一个系统级的目录,用于存放本地安装的用户级程序。/usr/sbin
:这是一个系统级的目录,用于存放标准的系统管理程序。/usr/bin
:这是一个系统级的目录,用于存放标准的用户级程序。
当在命令行中输入一个命令,比如 ls
,Shell 会按照上面的顺序搜索这些目录,直到找到相应的可执行文件为止。如果这些目录中都没有找到命令,Shell 会显示一个错误消息,如 command not found。
这个 PATH 环境变量确保了用户和系统能够访问到重要的系统命令和程序,同时也允许用户在个人目录中安装和使用自己的程序,而不会影响到系统级别的设置。
简单来说,PATH 的功能:
- 定位可执行文件:当用户输入一个命令,如
ls
,Shell 会按照 PATH 环境变量中定义的目录顺序去搜索名为ls
的可执行文件。 - 执行命令:一旦找到匹配的可执行文件,Shell 就会执行该文件,而无需用户指定完整的文件路径。
在Linux系统中,ls 命令是用户频繁使用的命令之一,用于列出目录内容。该命令默认位于 /bin 目录下,这个目录是包含在 PATH 环境变量中的,因此用户可以直接通过命令名来执行它。
如果您决定将 ls 命令移动到 /root 目录下,请注意,/root 默认不在 PATH 环境变量的搜索路径中。因此,当您尝试执行 ls 命令时,Shell 将无法在 PATH 指定的目录中找到 ls 的可执行文件,从而导致错误提示:“bash: /bin/ls: No such file or directory”。
例如,以下是移动 ls
命令和尝试执行它的命令序列:
[root@localhost ~]# mv /bin/ls /root
[root@localhost ~]# ls
bash: /bin/ls: No such file or directory
在这种情况下,如果希望继续使用 ls
命令,有两种方法可以解决这个问题:
临时修改 PATH 环境变量,可以将 /root 添加到当前的 PATH 环境变量中。这样,Shell 就会在新的路径中搜索 ls
命令:
[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[root@localhost ~]# ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
请注意,这种修改只在当前Shell会话中有效。一旦退出当前会话,PATH 环境变量将恢复为其默认值。
另一种方法是直接使用 ls
命令的绝对路径来执行它:
[root@localhost ~]# /root/ls
Desktop Downloads Music post-install Public Videos
Documents ls Pictures post-install.org Templates
这种方法不依赖于 PATH 环境变量,因此可以确保命令的执行,无论 ls
命令位于何处。
为了保持系统的稳定性和可预测性,强烈建议不要更改系统命令的默认位置。如果您出于某种原因需要临时移动 ls 命令,一旦完成相关工作,应将其放回原位:
[root@localhost ~]# mv /root/ls /bin
通过这种方式,您可以确保系统命令的正常运行,同时避免可能对系统稳定性造成的影响。