系统级

  • /etc/environment:该文件设置的是整个系统的环境,只要启动系统就会读取该文件,是系统启动时读取的第一个文件,用于为所有进程设置环境变量。该文件并不是一个脚本文件,系统使用此文件时并不是执行此文件中的命令,而是根据 KEY=VALUE 模式的代码(VALUE中不能有空格),对 KEY 赋值以 VALUE,因此文件中如果要定义 PATH 环境变量,只需加入一行形如 PATH=PATH:/xxx/bin的代码即可;

  • /etc/profile:在进入操作系统使用的第二个文件,为系统的每个用户设置环境变量,这里的环境变量是永久性的。当系统启动后用户首次登录时,该文件被执行,并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。

  • /etc/profile.d/.sh :每当进入一个 login shell 或加载桌面会话时,/etc/profile.d 目录中的所有 .sh 脚本都会执行。因为 /etc/profile 文件会循环遍历执行改目录下的文件 .sh 文件;

  • /etc/bashrc:是针对所有用户的 bash 初始化文件,在此中设定的环境变量将应用于所有用户的 shell 中,此文件会在用户每次打开 shell 时执行一次。(即每次新开一个终端,都会执行 /etc/bashrc)。

用户级

  • ~/.pam_environment :当使用图形化界面设置区域和语言时,该文件会被修改。Ubuntu 系统中有该文件,CentOS 系统中没发现有该文件。

  • ~.bash_profile (或./bash_login 或 ~.profile):每个用户都可使用该文件输入专属于自己的 shell 信息,当用户登录时,该文件仅仅执行一次。默认情况下,该文件设置一些环境变量、读取用户的 ~/.bashrc 文件。(如果 ~/ 目录下没有.bash_profile ,则新建立一个)。当一个 shell 关闭时,在 .bash_profile 中定义的系统变量则会失效。因此,每打开一个新的 login shell 时都要运行一次 source .bash_profile,而且针对当前用户。该文件中的读取会在/.pam_environment 文件之后,推荐在这里进行个人环境变量设置*

  • ~/.bashrc:该文件包含专用于某个用户的 bash shell 的 bash 信息,当登录时以及每次打开新的shell时,该该文件都会被读取;

  • ~/.bash_logout :当每次退出系统(退出 bash shell)时执行该文件。

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

null

其中,实线的的方向是主线流程,虚线的方向则是被调用(或读取)的配置文件 ,执行完 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 下也有查看、设置环境变量的命令。查看或修改环境变量可以使用以下几个命令:

  • export :直接使用使用该命令可以打印出当前所有环境变量,使用 export 变量名 形式的命令可以打印出某个环境变量的值,使用 export 变量名=变量值 可以用来临时(只对当前 shell 有效,shell关闭了,该变量也就失效了)设置某个环境变量的值。其用法与 Windows 下的 set 命令基本类似。有关 export 命令的其他用法请参考 export 命令的帮助说明。

  • echo 命令:结合 echo变量名 形式的命令可以打印出某个环境变量名。Linux 下使用 $ 来引用某个环境变量。

  • printenv :该命令单独使用可以输出本地所有环境变量,也可以使用 printenv 变量名 形式的命令打印出某个环境变量的值,就像 export 命令打印某个环境变量的值一样。

  • env :该命令也可以来显示所有环境变量,但不能用于显示单个的环境变量。该命令也可以用来临时修改某个环境变量的值,这种用户类似于 export 临时修改环境变量的值。

  • set :单独使用该命令可以查看为某个特定进程设置的所有环境变量,包括局部变量、全局变量 ,以及用户定义变量。使用 set 变量名=变量值 形式的命令可以设置某个环境变量的值,如果未指定变量值,则该变量值将被设为 NULL。

  • setenv :该命令属于 C shell。设置环境变量的语法为 setenv 变量名 变量值;

  • unset :使用 unset 变量名 形式的命令可以临时清除某个环境变量,再次查看该环境变量将看不到结果。

  • readonly :设置只读环境变量,如 readonly HELLO 。如果使用了readonly 命令的话,变量就不可以被修改或清除了。

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

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

export 变量的作用

1.export 用于声明一个环境变量: export variable=value

2.该环境变量只在本进程和其子进程中可以访问。

3.如果是在系统级的配置文件中,如 /etc/profile中 export 一个变量,那么这个变量就会在整个系统运行期间都起作用。即使新开shell会话连接甚至重启了服务器仍可生效。

4.如果在用户级 ~/.bash_profile 之类的文件中,则每次启动shell都会去读这个文件,所以每次打开shell也是可以取到这个值的。

5.如果在某一次运行中,手动export一个变量,则只在这次shell的使用中,才能访问这个变量,或者在该shell启动的启动程序中,也是可以访问这个变量的,因为它们是这个shell的子进程。新开shell连接及重启服务器都会失效。

如果在~/.bash_profile设置环境变量,当此用户登陆的时候,该文件仅仅执行一次,可以获取到变量

results matching ""

    No results matching ""