Linux环境变量

1、环境变量的概念

  Linux 的变量可分为两类:环境变量本地变量

  环境变量:或者称为全局变量,存在于所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。

  本地变量:当前shell 中的变量,很显然本地变量中肯定包含环境变量。Linux 的本地变量的非环境变量不具备继承性。

  (1)环境变量的含义

    Linux环境变量也称之为Shell环境量变,以下划线和字母打头,由下划线、字母(区分大小写)和数字组成,习惯上使用大写字母,例如PATH、HOSTNAME、LANG等。程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。

  (2)环境变量的分类

    1)按生效的范围分类。

    系统环境变量:公共的,对全部的用户都生效。

    用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

    2)按生存周期分类。

    永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。

    临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

2、Linux 中环境变量的文件

  当你进入系统的时候,Linux 就会为你读入系统的环境变量,Linux 中有很多记载环境变量的文件,它们被系统读入是按照一定的顺序的。

  shell进程每次启动的时候,他都会从shell配置文件里的代码来做一些初始化的工作,与shell配置有关的文件主要有:/etc/profile、~/.bash_profile、~/.bash_login、 ~/.profile、~/.bashrc 、  /etc/bashrc、     /etc/bash.bashrc 、/etc/profile.d/*.sh。

  shell执行顺序:/etc/profile--->~/.profile(~/.profile在不同linux版本有不同的名字,比如有可能叫做~./bash_profile、 ~/.bash_login等)

  (1)/etc/profile 

  此文件为系统的环境变量,它为每个用户设置环境信息,当用户第一次登录时,该文件被执行,执行时并从 /etc/profile.d 目录的配置文件中搜集 shell 的设置。这个文件是任何用户登陆操作系统以后都会读取的文件(如果用户的 shell 是csh 、tcsh 、zsh ,则不会读取此文件),用于获取系统的环境变量,只在登陆的时候读取一次。

  (2)~/.profile 

  只有当前用户登陆的的时候才会执行。

  (3) /etc/bashrc 

  在执行完/etc/profile 内容之后,如果用户的SHELL 运行的是bash ,那么接着就会执行此文件。另外,当每次一个新的bash shell 被打开时, 该文件被读取每个使用bash 的用户在登陆以后执行完/etc/profile 中内容以后都会执行此文件,在新开一个bash 的时候也会执行此文件。因此,如果你想让每个使用bash 的用户每新开一个bash 和每次登陆都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。

  (4) ~/.bash_profile 

  每个用户都可使用该文件输入专用于自己使用的shell 信息。当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,并执行用户的 .bashrc 文件。单个用户此文件的修改只会影响到他以后的每一次登陆系统。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么它在每次登陆的时候都会去获取这些新的环境变量或者做某些特殊的操作,但是仅仅在登陆时。

  (5)~/.bashrc 、 /etc/bashrc

  该文件包含专用于单个人的bash shell 的bash 信息,当登录时以及每次打开一个新的shell 时, 该文件被读取。单个用户此文件的修改会影响到他以后的每一次登陆系统和每一次新开一个bash 。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么每次它新登陆系统或者新开一个bash ,都会去获取相应的特殊的环境变量和特殊操作。

  (6)~/.bash_logout 

  当每次退出系统( 退出bash shell) 时, 执行该文件。

  用户登录后加载profile和bashrc的流程如下: 

  1) /etc/profile --->/etc/profile.d/*.sh 

  2) $HOME/.bash_profile --->$HOME/.bashrc --->/etc/bashrc 

  bash首先执行/etc/profile脚本, /etc/profile脚本先依次执行/etc/profile.d/*.sh ,随后 bash 会执行用家目录下的 .bash_profile脚本, .bash_profile脚本会执行家目录下的 .bashrc脚本, 而.bashrc脚本会执行 /etc/bashrc 脚本 ,至此, 所有的环境变量和初始化设定都已经加载完成,bash 随后调用 terminfo 和 inputrc,完成终端属性和键盘映射的设定.

  如果变量需要全部用户、全部进程共享,可以将变量添加到:/etc/bash.bashrc 。

  如果变量需要一个用户、全部进程共享,可以将变量添加到:~/.bashrc 。

  shell启动方式对变量的影响

  shell的4种启动方式:

    在当前进程中执行:source和.           --->可以访问当前进程shell脚本中的变量

    在子shell进程中执行:/bin/bash和./     --->不能访问父进程中shell脚本的变量

2、常用的环境变量

  (1)查看环境变量

    1)env命令

    在Shell下,用env命令查看当前用户全部的环境变量。

 

    上图只截取了部分环境变量,并非全部。

    用env命令的时候,满屏显示了很多环境变量,不方便查看,可以用grep筛选:env|grep 环境变量名

    例如查看环境变量名中包含PATH的环境变量:env|grep PATH

    2)echo命令

    echo $环境变量名

 

    注意,符号$不能缺少,这是语法规定。

  (2)、常用的环境变量

    1)PATH

    可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序,PATH变量的具体用法本文后面的章节中有详细的介绍。

    2)LANG

    Linux系统的语言、地区、字符集,LANG变量的具体用法本文后面的章节中有详细的介绍。

    3)HOSTNAME

    服务器的主机名。

    4)SHELL

    用户当前使用的Shell解析器。

    5)HISTSIZE

    保存历史命令的数目。

    6)USER

    当前登录用户的用户名。

    7)HOME

    当前登录用户的主目录。

    8)PWD

    当前工作目录。

    9)LD_LIBRARY_PATH

    C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

    10)CLASSPATH

    JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

3、设置环境量

变量名=''
export 变量名
或
export 变量名=''

  如果环境变量的值没有空格等特殊符号,可以不用单引号包含。

  示例:

export ORACLE_HOME=/oracle/home
export ORACLE_BASE=/oracle/base
export ORACLE_SID=snorcl11g
export NLS_LANG='Simplified Chinese_China.ZHS16GBK'
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:.

  采用export设置的环境变量,在退出Shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在登录脚本文件中配置。

  (1)、系统环境变量

  系统环境变量对全部的用户生效,设置系统环境变量有三种方法。

    1)在/etc/profile文件中设置。

    用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。

    2)在/etc/profile.d目录中增加环境变量脚本文件,这是Linux推荐的方法。

    /etc/profile在每次启动时会执行 /etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除 /etc/profile.d下对应的 shell 脚本即可。

    /etc/profile.d目录下有很多脚本文件,例如:

 

    3)在/etc/bashrc文件中设置环境变量。

    该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

  (2)、用户环境变量

  用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。

  在用户的主目录,有几个特别的文件,用ls是看不见的,用ls .bash_*可以看见。

    1).bash_profile(推荐首选)

    当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。

    2).bashrc

    当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。

    3).bash_logout

    当每次退出系统(退出bash shell)时执行该文件。

    4).bash_history

    保存了当前用户使用过的历史命令。

  (3)、环境变量脚本文件的执行顺序

  环境变量脚本文件的执行顺序如下:/etc/profile--->/etc/profile.d--->/etc/bashrc--->用户的.bash_profile--->用户的.bashrc

  同名的环境变量,如果在多个脚本中有配置,以最后执行的脚本中的配置为准。

  还有一个问题需要注意,在/etc/profile中执行了/etc/profile.d的脚本,代码如下:

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.d和/etc/profile的执行顺序还要看代码怎么写。

4、重要环境变量的详解

  (1)、PATH环境变量

  可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

    1)PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

    export PATH=目录1:目录2:目录3:......目录n:.

    2)PATH缺省包含了Linux系统命令所在的目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

    3)在用户的.bash_profile文件中,会对PATH进行扩充,如下:export PATH=$PATH:$HOME/bin

    4)如果PATH变量中没有包含圆点.,执行当前目录下的程序需要加./或使用绝对路径。

  (2)、LANG环境变量

  LANG环境变量存放的是Linux系统的语言、地区、字符集,它不需要系统管理员手工设置,/etc/profile会调用/etc/profile.d/lang.sh脚本完成对LANG的设置。

  CentOS6.x 字符集配置文件在/etc/syscconfig/i18n文件中。

  (3)、LD_LIBRARY_PATH环境变量

  C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。

  LD_LIBRARY_PATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

  export LD_LIBRARY_PATH=目录1:目录2:目录3:......目录n:.

  (4)、CLASSPATH

  JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要。

  CLASSPATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

5、环境变量的生效

  (1)在Shell下,用export设置的环境变量对当前Shell立即生效,Shell退出后失效。

  (2)在脚本文件中设置的环境变量不会立即生效,退出Shell后重新登录时才生效,或者用source命令让它立即生效,例如:source /etc/profile

6、应用经验

  虽然设置环境变量的方法有多种,但是建议系统环境变量建议在/etc/profile.d目录中配置,用户环境变量在用户的.bash_profile中配置,不建议在其它脚本文件中配置环境变,会增加运维的麻烦,容易出错。

posted @ 2022-08-21 12:14  孤情剑客  阅读(1656)  评论(0)    收藏  举报