环境变量详解

一、什么是环境变量

1、百科上的解释

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。

2、自己的理解:

“环境”可以理解为操作系统,比如Linux、Windows。在操作系统中我们可以安装各种软件,比如说安装了QQ。当我们想打开QQ时,需要找到QQ.EXE,双击打开,如果QQ.EXE隐藏的比较深,寻找起来很费劲,有没有其他简单的方式呢?当然是有的,我们可以将它添加到系统支持的Path变量中,该变量指向QQ.EXE所在的位置,下次要打开QQ.EXE时,直接输入QQ就可以打开了(通过操作系统命令行模式)。

举个例子,帮助理解下环境变量。我们在Windows操作系统装安装了一个QQ,打开它的方式有哪些?

(1)首先想到的是找到QQ的安装目录,找到QQ.EXE,双击打开。

(2)第一种方式是通过界面操作,我们还可以通过命令行操作,首先要知道QQ.EXE的位置,比如在“D:SoftInstallPackageQQBin”,QQ的应用程序名称为“QQ.EXE”,那么我们打开powershell,先切换到QQ.EXE所在的目录,然后执行操作如下:

(3)以上两种方式都要记住QQ.EXE所在的目录,每次打开都需要找到相应的目录,比较麻烦,能不能在powershell中直接输入QQ.EXE就能执行,而不是每次都进入QQ的安装目录再启动,这个时候可以通过配置系统环境变量Path来实现。右击“我的电脑”,选择“属性”,在打开窗口中点击左边的“高级系统设置”,出现“系统属性”窗口,在“高级”选项卡下面点击“环境变量”。

编辑系统变量名“Path”,在“Path”编辑面板中新增QQ的安装目录:D:SoftInstallPackageQQBin,如图:

确定保存后,再回到命令窗口,不管在任何目录下,你只要输入QQ的命令,qq就会启动。

 (4)QQ快捷图标的方式打开QQ,为什么通过QQ快捷图标就能够打开QQ.EXE?其实很简单,就是通过添加环境变量的方式实现的,和第三个方式的原理一样,只不过执行的时候是通过界面操作(即点击快捷图标)。

3、总结

通过上边的例子我们基本就能理解环境变量是干嘛的了,怎么更好的去描述他呢?我们把百科的解释变通下:环境变量是操作系统(可以将操作系统想象成方法Fun(object 环境变量))中的参数,传入不同的参数,可以让操作系统(方法)做出不同的响应。即环境变量==操作系统这个大环境下的指令,该指令是人为指定的。

二、为什么要设置环境变量

在第一部分就详细的阐述了环境变了,也能从中感受到了环境变量的作用,这里我们根据百科中的阐述解析下:

设置参数

设置参数就是人为指定Path,下次启动某个软件或者执行某个命令的时候就会方便很多,提高工作效率。

软件共用

比方说我们在计算机上安装双系统,C盘安装Windows XP,D盘安装Windows 7。在XP系统上安装的软件无法在Windows7系统中使用,一般情况下我们都会在Windows7系统中在安装一次该软件。其实还有更好的方式,就是利用环境变量,即在两个系统中都指定该软件的环境变量,那么只需要在其中的一个系统中安装一次,两个系统中都可以使用。

系统运行

接着上边软件公用说,为什么在Windows XP中安装了的软件在Windows 7下无法运行呢(绿色软件除外,绿色软件不需要在操作系统中写入配置,就是一个封装好的exe,所以能够共用)?原因是安装软件时往往须要向系统目录中复制某些文件,而使用另外一个系统时会由于缺少这些文件而无法运行。因此,我们可以通过设置环境变量的方法来解决这个问题,即通过配置环境变量,指定软件的安装目录,那么在两个系统上打开该软件的时候,都会到该安装目录下打开。

三、Windows操作系统如何配置环境变量

打开控制面板-系统和安全-系统-高级系统设置-高级-环境变量,如下图:

 打开环境变量编辑框,可以看到,环境变量分为用户变量和系统变量,如下图

在系统变量中找到Path一栏 ,打开新增你想新增的变量

 保存之后就可以了,上边提到环境变量分为用户变量和系统变量,他们的关系是什么样的呢?环境变量包括系统变量和用户变量,我们知道一个Windows系统可以指定多个用户,每个用户都可以配置属于自己的变量,这样的变量就是用户变量,每个用户拥有不同的用户变量,不同用户的用户变量之间是并列的,也是互不干扰的。任何系统用户都在用系统变量,因此如果系统变量变化了,每个系统用户都将受到影响。他们的关系如下图所示:

 四、Linux系统环境变量

在 Linux 系统中,有环境变量和 Shell 变量这两种变量。环境变量是在程序及其子程序中全局可用的,常常用来储存像默认的文本编辑器或者浏览器,以及可执行文件的路径等等这样的信息。而 Shell 变量仅在当前 Shell 中可用,可以用来存储当前用户的 ID 等信息。

1、环境变量

环境变量是以键值对的形式实现的,是在整个系统范围内都可用的变量,并由所有派生的子进程和 Shell 继承。而环境变量的名称是区分大小写的,且通常以大写的形式命名

单个值的环境变量看起来是这样的:

KEY=value1

如果你想要将多个值赋予环境变量,则通常用冒号 ( : ) 作为分隔符。每一对键值对最终看起来是这样子的:

KEY=value1:value2:value3

如果要赋予环境变量的值包含空格,则需要使用引号:

KEY="value with spaces"

2、Shell 变量

Shell 变量是专门用于设置或定义它们的 Shell 中的变量。每个 Shell ,例如 zsh 和 bash ,都有一组自己内部的 Shell 变量。它们通常用于跟踪临时数据,比如当前工作目录,而用法则与环境变量相同。

如果你想让 Shell 变量作为全局变量使用,可以使用 export 指令:

$ export MYVAR=lxlinux.net
$ echo $MYVAR
lxlinux.net
$ env | grep MYVAR
MYVAR=lxlinux.net

3、常见的环境变量

变量名 含义
TERM 这指定运行 Shell 时要模拟的终端类型。可以针对不同的操作需求模拟不同的硬件终端。不过,你通常不需要管这个变量。
USER 当前登录的用户
PWD 当前的工作目录
OLDPWD 上一个工作目录,这个变量由 Shell 保存,以便通过执行 cd - 切换回上一个工作目录。
LS_COLORS 这定义了 ls 指令的颜色输出代码,用于向 ls 指令添加颜色输出。这通常用于区分不同的文件类型并使用户对文件类型等信息一目了然。
MAIL 当前用户邮箱的路径
PATH 系统在查找指令时会检查的目录列表。当用户输入一个指令时,系统将按此目录列表的顺序检查目录,以寻找相应的可执行文件。
LANG 当前的语言和本地化设置,包括字符编码。
HOME 当前用户的主目录
_ 上一个被执行的指令

4、常见的 Shell 变量

变量名 含义
BASHOPTS 执行 bash 时所启用的选项列表,这对于确定 Shell 环境是否按照预期的方式运行很有帮助。
BASH_VERSION 人类可读格式的正在执行的 bash 版本
BASH_VERSINFO 机器可读格式的正在执行的 bash 版本
COLUMNS 用于设置绘制到屏幕上的输出信息的宽的列数
DIRSTACK pushd 和 popd 命令可用的目录堆栈。
HISTFILESIZE 存储到文件中的命令历史记录的行数。默认为 ~/.bash_history 文件的行数。
HISTSIZE 内存中允许存储的命令历史记录的行数,即 histroy 命令所能打印出来的行数。
HOSTNAME 计算机的主机名
IFS 内部字段分隔符,用于分隔命令行上的输入。 默认以空格作为分隔符。
PS1 定义主命令提示符。 这用于定义启动 Shell 会话时命令提示符的外观。而 PS2 用于声明跨越多行的命令的命令提示符。
SHELLOPTS 可以用 set 命令设置的 Shell 选项。
UID 当前用户的 UID (用户 ID)

5、查看 Shell 变量与环境变量

在 Linux 系统中,有以下几种命令可以让你查看环境变量:

env — 该命令可以让你在自定义的环境中运行程序,并且不需要改变当前的环境。当不带参数使用 env 命令时,它会打印出当前的环境变量列表。

printenv — 可以打印出所有的或者指定的环境变量。

set — 该命令可以设置或者删除 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

默认状态下,env 和 printenv 的功能是完全相同的:

$ printenv 
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=alvin
MYVAR=lxlinux.net
PWD=/home/alvin
HOME=/home/alvin
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/alvin
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=alvin
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv

只有在更具体的功能上才能体现出 env 命令与 printenv 命令的区别。例如,使用 printenv 命令,你可以请求单个变量的值:

$ printenv SHELL
/bin/bash
$ printenv HOME
/home/alvin
$ printenv MYVAR
lxlinux.net

env 命令可通过将一组变量传递给命令来修改程序运行的环境:

env MYVAR=lxlinux.net command_to_run command_options

printenv 与 env 命令只能打印出环境变量,而如果你想打印出所有变量或者 Shell 函数的列表,你可以使用 set 指令。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/alvin/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/alvin
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=$' 	
'
LANG=C.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=35
LOGNAME=alvin
.....

6、设置Shell变量与环境变量

Linux 系统中可以设置环境变量的命令有以下几种:

set — 该命令可以设置或者取消设置 Shell 变量。当不带参数使用 set 命令时,它将打印出包括环境变量与 Shell 变量在内的所有变量以及 Shell 函数的列表。

unset — 该命令可以删除 Shell 变量以及环境变量。

export — 该命令可以设置环境变量。

为了更好地理解 Shell 变量和环境变量之间的区别,我们先从设置 Shell 变量开始讲,然后再讲环境变量。先从在当前会话中定义一个 Shell 变量开始:

$ MYVAR=lxlinux

你可以用 echo $MYVAR 来验证变量是否已设置:

$ echo $MYVAR
lxlinux

使用 printenv 命令检验该变量是否为环境变量:

$ printenv MYVAR

没有输出返回,这就意味着 MYVAR 变量并不是环境变量。

export 命令可以用来设置环境变量。要创建环境变量,只需用 export 命令将 Shell 变量导出为环境变量:

$ export MYVAR

你可以用以下语句检验:

$ printenv MYVAR
lxlinux

当然,你也可以只用一行代码来设置环境变量:

$ export MYNEWVAR="My New Variable"

但是以这种方式创建的环境变量只能用于当前会话,如果你打开一个新的 Shell 会话,或者退出登陆,所有的变量都将会丢失。

我们也可以将环境变量还原为 Shell 变量,或者将其完全删除:MYVAR 变量被定义为环境变量,我们可以通过输入以下代码将其还原为 Shell 变量:

$ export -n MYVAR

这样,MYVAR 变量就不再是环境变量了,但依然还是 Shell 变量。无论是 Shell 变量还是环境变量,想要完全删除变量,都可以使用 unset 命令来删除:

$ unset MYVAR

可以通过以下语句来验证 MYVAR 变量已经删除:

$ echo $MYVAR

由于变量已经删除了,所以没有任何返回。

7、环境变量的持久化

许多程序都需要使用环境变量来决定具体的执行方式,但是,我们并不希望每次启动新的 Shell 会话时都必须重新设置重要的变量,因此我们需要将重要的环境变量写入配置文件中。Shell 会话有不同的启动方式,比如,连接到终端的交互式 Shell 与未连接到终端的非交互式 Shell,还有登录式 Shell 与非登录式 Shell, 而 bash Shell 会根据会话不同的启动方式而读取不同的配置文件。但是,在大多数 Linux 发行版中,当你启动一个新的 Shell 会话时,一般都会从以下文件中读取环境变量:

/etc/environment — 使用此文件来设置系统范围内可用的环境变量。

/etc/profile — 每当 bash 登录 Shell 时,都会加载此文件中设置的变量。

~/.bashrc — 每个用户特定的 Shell 配置文件。例如, 如果你使用的是Bash,就可以在其中声明变量。

如果要将新的环境变量加载到当前的 Shell 会话中,可以使用source命令:

$ source ~/.bashrc

如果你想要设置环境变量,你就可以考虑将其添加到 /etc/profile 、/etc/bash.bashrc 或 /etc/environment 文件中。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注