Ubuntu 环境变量配置

Linux是多用户操作系统,每个用户登陆后都有属于自己的环境,定义着自己专有的变量值。同时Linux是基于文件,和Windows的注册表很不相同。

本文是基于Ubuntu 所写,其它Linux系统设置其本雷同。

举例来说,在终端下,你输入一个命令,会出现 Command not found , 但系统中已经安装过该程序,只是不在标准位置,此时你只能通过全路径的方式来执行/usr/local/app/bin/run,但每次输入很是繁琐,这时就可以通过添加该目录到系统环境变量PATH中来实现执行文件的查找。

http://imcn.me/wp-content/uploads/2010/04/ubuntu-ad1.jpg

变量认识

####显示当前所有的变量值

环境变量是在终端(Shell)中被使用,也可以通过Shell来对其进行操作,所有变量值均使用大写。

打印所有变量值:

1
2
$ env
$ export

打印系统PATH中的所有路径:

1
$ echo $PATH

打印USER变量值:

1
$ echo $USER

也可通过set来显示本地定义的变量集

设置新的变量

在Shell中,可以通过export命令来设置新的变量,如下,创建新的变量MYVAR:

1
2
$ export MYVAR=”lanvige.com”
$ echo $MYVAR
使用readonly命令创建只读变量
1
2
$ export MYVAR=”lanvige.com”
$ readonly MYVAR

清除环境变量

在Shell中可以使用unset命令来清除变量值

1
$ unset MYVAR

常用到的环境变量

1
2
3
4
5
PATH       决定了shell将到哪些目录中寻找命令或程序
HOME       当前用户主目录
LOGNAME/USER   当前用户的登录名
HOSTNAME     指主机的名称
SHELL       前用户Shell类型

设置永久环境变量

刚已经演示如何添加环境变量,但通过export方式所添加变量值的生命周期仅为当前shell,重新打开新的shell时,该变量会丢失,如何设置一个永久的变量值,可以根据你的需求将变量值添加到上述5个文件中的其中一个来实现。

如果我们想在变量中加入新的path,则可以如下:

1
$ vim ./bashrc

添加如下行在未尾,这里需考虑PATH查找优先级,如一个命令在不同的PATH中出现,会使用最前定义的PATH值,多个PATH间用:隔开。

1
export PATH=”PATH=$PATH:<PATH 1>:<PATH 2>”

使其生效

刚有提到,当改变配置文件时,重启shell才能使其生效,但通过source命令也能达到同样的效果,如果修改的是.bashrc文件,则输入。

1
$ source ~/.bashrc

环境变量配置文件

在Ubuntu中有如下5个文件可以设置环境变量,对应着系统级别[所有用户]和用户级别[个人用户],分别放在/etc/~/下。同时这几个文件有着明确执行顺序。

  • /etc/profile
    系统登录时,定制用户环境时使用的第一个文件,为系统的所有用户设置环境变量,当用户第一次登录时,该文件被执行。
  • ~/.bash_profile || ~/.bash_login || ~/.profile
    交互式登陆 shell - interactive & login shells,在login方式登陆时,该文件被执行,且仅执行一次。
    三个文档设定基本上是一样的,设置用户专有的路径、环境变量…,只是读取有优先关系。顺序为,读取~/.bash_profile,若它不存在,则读取~/.bash_login,若前两者不存在,读取~/.profile。
    • ~/.bash_profile
      Unbutu默认没有此文件,用户可自己创建。通常该配置文件还会配置成去读取~/.bashrc。
    • ~/.bash_login
    • ~/.profile
  • /etc/bashrc
    该文件会在每次bash shell打开时被执行,在当前Shell中添加环境变量。
  • ~/.bashrc
    interactive non-login shells 当登录时以及每次打开新的shell时,该文件被读取。(non-login形式执行时,读取此文件。若是以login形式执行,则不会读取此文件)
    某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次
  • ~/.bash_logout
    当每次退出系统(退出bash shell)时,执行该文件。

各种模式的读取顺序

  • 图形模式登录:/etc/profile > ~/.profile
  • 图形模式登录后,打开终端时:/etc/bash > bashrc > ~/.bashrc
  • 文本模式登录时,顺序读取:/etc/bash > /etc/bashrc > /etc/profile > ~/.bash_profile
  • 从其它用户su到该用户,则分两种情况:
    • 如果带-l参数(或-参数,–login参数),如:su -l username,则bash是lonin的,它将顺序读取以下配置文件:/etc/bash > bashrc > /etc/profile > ~/.bash_profile
    • 如果没有带-l参数,则bash是non-login的,它将顺序读取:/etc/bash > /etc/bashrc > ~/.bashrc
  • 注销时,或退出su登录的用户,如果是longin方式,那么bash会读取:~/.bash_logout
  • 执行自定义的shell文件时,若使用bash -l a.sh的方式,则bash会读取行:/etc/profile > ~/.bash_profile,若使用其它方式,如:bash a.sh./a.shsh a.sh(这个不属于bash shell),则不会读取上面的任何文件。

FAQ::

rc全称

配置文件.bashrc中rc的含义是resource configuration

登陆Shell与非登陆Shell

用文本方式登录之后,得到的就是一个 login shell,如果在这个 shell 里执行一下 bash 命令,就得到一个 non-login shell,区别就是读取的配置文件不同,non-login shell 只读取 rc 文件,如果在运行它之前,修改profile文件的话对它不起作用。

~/.bash_profile: 是interactive login shell方式进入 bash 运行的~/.bashrcinteractive non-login方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

交互式和非交互式

以上讨论的是交互式bash shell,其实shell有两种工作模式,就是:交互式和非交互式,执行脚本时,shell就工作在非交互式模式下。在非交互模式下,bash读取的startup文件由环境变量BASH_ENV来决定。

ISSUE: 执行脚本时的问题:

在Unicorn&Nginx的Init脚本配置中,需要使用rbenv中的shims,但rbenv的环境变量被配置在了~/.bashrc中,如果直接执行像unicorn来启动服务是没有问题的,但在脚本文件中调用unicorn就不行。会有Command Not Found的问题,在sh文件中配置PATH也不会生效。最后将rbenv的环境变量配置移动到~/.profile中问题就解决了。

REF::

http://blog.csdn.net/jiankun_wang/article/details/4317407