操作系统

环境变量详解(Windows&Linux)

2018-12-28  本文已影响0人  rosy_dawn

环境变量概述

环境变量(Environment Variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如 Windows 和 DOS 操作系统中的 path 环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 path 中指定的路径去找。如 tc 或 vc++ 中,set include=path1;path2; 是告诉编译程序到哪里去找 .h 类型的文件;当然不仅仅是指定什么路径,环境变量还有其它的作用的,如set dircmd=/4 设置一个环境变量的作用是在使用 dir 命令时会把 /4 作为缺省的参数添加到你的 dir 命令之后,就像你的每个命令都加了 /4 参数,它实际上是给命令解释程序 command 设置的一个环境变量,并且是给 dir 这个内部命令设置的。

很多朋友会在自己的计算机上安装双系统,例如 C 盘安装 Windows 10,D 盘安装 Windows 7。可是某些软件往往只在Windows 10 系统中安装,Windows 7 系统中是无法正常使用的,比较麻烦却有效的方法是再安装一遍。当我们了解了环境变量中的用途后就可以很好解决双系统的软件共用问题。为什么在 Windows 10 中安装了的软件(绿色软件和不兼容软件除外)在 Windows 7 下无法运行呢?原因是安装软件时往往须要向系统目录中复制某些文件,而使用另外一个系统时会由于缺少这些文件而无法运行,而我们可以通过设置环境变量的方法来解决这个问题。

环境变量设置

Windows 系统

Windows 系统常见环境变量如下:

设置方法

环境变量分为两类:用户变量与系统变量,在注册表中都有对应的项。其中用户变量位于:

HKEY_CURRENT_USER\Environment

系统变量位于:

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment

在 Windows 操作系统中可以通过我的电脑系统属性高级系统设置环境变量,在原有变量的基础上添加英文状态下的分号,然后将路径名输入即可。(切记,不要删除原先的系统变量,只要用分号隔开,然后添加,最后也要加上分号)。然而在此设置的环境变量是在注册表中具有对应的项。在 .net 中提供了一个类来获取系统的环境变量及其值。

Windows 平台以 Win 10 为例:
右键此电脑属性

env7.png

高级系统设置环境变量

env5.png

用户变量仅对当前的用户有效,系统变量对所有用户有效。

env9.png

考虑到不影响其他用户的使用,这里选择设置用户变量。选中用户变量中的Path编辑(如果没有 Path,则选择新建 Path):

env6.png

在弹出的对话框中就可以新建或编辑环境变量名和环境变量值了。

注意:Windows 下不区分大小写,因此 windows 与 WINDOWS 都正确;而 Linux 系统是严格区分大小写的。

命令行查看环境变量

在 Windows 命令行输入 set 命令可以查看 Windows 系统当前所存在的所有的环境变量。从环境变量中我们可以得到很多信息。

例如 PROCESSOR_IDENTIFIER 显示处理器的架构,USERDOMAIN 显示计算机名,USERNAME 显示计算机用户名,TEMP 显示系统临时文件夹的位置,PROMPT 显示当前提示符的状态灯。

env.png

也可以查看单个的环境的变量,例如输入 set windir 显示当前的系统文件夹的位置。输入 set P 可以查看所有字母以P开头的环境变量的值。也可以使用 echo 环境变量引用 来显示,如 echo %windir% 也可以显示当前的系统文件夹的位置。

注意:Windows 环境变量在引用的时候需要用 % 括起来,以便于和普通的字符区分。

env2.png

也可以自定义环境变量,例如我们输入 set aa=%temp% ,就代表把临时文件夹的值赋值给aa。我们还可以删除环境变量,例如我们输入 set aa= 就可以把我们刚才建立的环境变量删除了。

env3.png
有关 set 命令的其他用法请参考 set 命令帮助:在命令行输入 set /? 回车即可查看 set 命令帮助 env4.png

注意:不用担心在DOS窗口的修改会影响此电脑属性高级环境变量里的修改,因为 DOS 窗口的环境变量只是 Windows 环境变量的一个副本,副本的改动不会影响正本,所以在 DOS 窗口中以 set 命令对环境变量的操作只对当前窗口的应用有效。要想永久加入环境变量,就要用图形界面操作。 但是 DOS 窗口的环境变量改动会触发正本(图形界面环境变量的修改)的刷新,这可用于使图形界面的环境变量设置立即生效

Linux 系统

环境变量配置文件

Linux 中环境变量也包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,相关配置文件位于 /etc 目录下,而用户级的环境变量则是该用户使用系统时加载的环境变量,仅对当前登录的用户有效,相关配置文件位于用户个人目录下,使用 ls -a 可以查看到这些文件。所以管理环境变量的文件也分为系统级和用户级的。

首先理解一下几个概念:

系统级:

用户级:

登陆 shell 与非登陆 shell 读取 shell 配置文件的顺序:

20170816110046308.png

其中,实线的的方向是主线流程,虚线的方向则是被调用(或读取)的配置文件 ,执行完 bash 操作后退出 bash shell 时会执行~/.bash_logout 文件。

对于 login shell 读取文件的顺序是:

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

其中,/etc/profile 是必须要执行的,后面 3 个按照顺序读取存在的那一个,而后面的就不会再执行。退出交互控制台执行的文件是 ~/.bash_logout

~/.bashrc 是在 non-login shell 启动时执行的,也就意味着在图形界面每开启一次 terminal,就会读取一次该文件。在很多 Red hat 和 Ubuntu 的发行版中,如果 .bashrc 存在于 /home目录下的某个用户目录中,它将从 .bash_profile.profile 中运行。

另:/etc/environment 是整个系统的环境,而 /etc/profile 是所有用户的环境,前者启动系统后就会去读取该文件,后者只有在用户登录的时候才去读取。

了解他们的执行顺序后,就知道环境变量该怎么放了。要想对所有的用户生效,那就需要设置系统级的环境变量。反之,需要修改用户级的文件。建议将 Java 的环境变量都配置于/etc/profile (所有用户可用)或 ~/.bash_profile~/.bash_login~/.profile 中(仅当前用户可用,优先存在哪一个文件就配置在哪一个文件中)。

选择哪些文件配置环境变量

许多人都在 /etc/profile 文件中设置系统级环境变量,但是不建议这样做。执行 cat /etc/profile 可以看到如下内容:

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

说明一般不建议修改该文件,因为操作系统升级时无法自动合并这里配置的环境的变量,而且一旦配置出错影响范围较大。该文件后面还有这样一段内容:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then 
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

说明每次执行 /etc/profile 文件都会循环遍历执行 /etc/profile.d 目录下的 .sh 文件,所以建议把某一类系统环境变量单独配置到某个 .sh 文件中,放在 /etc/profile.d 目录下即可。

如果要单独为某个用户设置环境变量,可以将环境变量配置在 ~/.bashrc 文件中。

操作环境变量的命令

Linux 下也有查看、设置环境变量的命令。查看或修改环境变量可以使用以下几个命令:

不同于 Windows 系统,Linux 系统上的环境变量名是区分大小写的,通常用全部大写的字母表示。

命令 env、printenv 和 set 之间的差异很细微。set 命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序。env 和 printenv 命令同 set 命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env 和 printenv 的输出是重复的。

上一篇 下一篇

猜你喜欢

热点阅读