在学习Linux的环境变量之前,先上2张windows下面的图对比分析下
7W分解学习:
What (环境变量基本定义)
什么是环境变量?
环境变量是否和windows一样也区分系统级别环境变量和用户级环境变量?
环境变量的读取是否会有优先级的区分或者存储覆盖关系?
环境变量的设置是否会有一些安全或者隐私上的隐患?
默认的环境变量里的值都是什么意思,是否还有其他的取值范围?
能操作环境变量的软件都有哪些?set,declare,export
why (和目的相关)
为什么要设置环境变量?
在shell里面登录另外一个用户,如果不用su - username,则切换了用户,环境变量还是之前用户的环境变量?
默认的环境变量里的哪些值是不能删除的?
环境变量里的值是否需要经常监测或者关注?如果有哪些是需要特殊注意的?
when (和时间相关)
什么时候设置环境变量,有哪些手段可以设置环境变量?
环境变量的预设置,读取的加载过程是如何的?
环境变量的生命周期?powerOn-》Login->LogOut-》powerOff
who & whose (和用户相关)
谁可以设置环境变量?超级管理员,普通管理员,普通用户,指定用户的环境变量如何设置和规划?
谁可以预设置一些潜在的环境变量?
谁的环境变量可以被预设?
谁的环境变量在哪里查看,例如超级管理员是否可以利用类似【超级管理员可使用ps去查看所有用户的home目录】的命令去查看所有用户的环境变量?
which (哪一个)
当用户执行env指令的时候,系统是如何判断需要读取哪个用户的环境变量的?
当用户login的时候,是不是会把当前用户的uid,username等信息存储到和当前用户相关的环境变量里?
当用户logout的时候,会不会把一些不需要的变量也从找个用户的环境变量remove掉?(如果能,突然断电后,操作系统是否会修复这些信息 )
如果用户某天抽风了,把密码存储到了环境变量里,相对于其他用户是否是安全的?
where(和环境上下文相关)
哪些地方可以设置环境变量
环境变量都在哪些地方使用?哪些软件会使用到环境变量?
环境变量都存在哪里了?数据结构是如何的?
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。
值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。
我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下:
[root@localhost ~]# env
ORBIT_SOCKETDIR=/tmp/orbit-root
HOSTNAME=livecd.centos
GIO_LAUNCHED_DESKTOP_FILE_PID=2065
TERM=xterm
SHELL=/bin/bash
......
Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,但是,我们没有必要逐一学习每个变量,这里给大家列举了 10 个非常重要的环境变量,如表 1 所示。
环境变量名称 | 类型 | 作用 |
---|---|---|
HOME | where | 用户的主目录(也称家目录) |
SHELL | which | 用户使用的 Shell 解释器名称 |
PATH | where | 定义命令行解释器搜索用户执行命令的路径 |
EDITOR | which&where | 用户默认的文本解释器 |
RANDOM | what | 生成一个随机数字 |
LANG | which | 系统语言、语系名称 |
HISTSIZE | what | 输出的历史命令记录条数 |
HISTFILESIZE | what | 保存的历史命令记录条数 |
PS1 | what | Bash解释器的提示符 |
where | 邮件保存路径 |
Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的环境变量会因为用户身份的不同而具有不同的值。
例如,使用下述命令来查看 HOME 变量在不同用户身份下都有哪些值:
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# su - user1 <--切换到 user1 用户身份
[user1@localhost ~]$ echo $HOME
/home/user1
这里的 su 命令可以临时切换用户身份,此命令的具体用法会在后续章节做详细介绍。
其实,环境变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建环境变量来满足工作需求。例如,设置一个名称为 WORKDIR 的环境变量,方便用户更轻松地进入一个层次较深的目录,执行命令如下:
[root@localhost ~]# mkdir /home/work1
[root@localhost ~]# WORKDIR=/home/work1
[root@localhost ~]# cd $WORKDIR
[root@localhost work1]# pwd
/home/work1
但是,这样的环境变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 export 命令将其提升为全局环境变量,这样其他用户就可以使用它了:
[root@localhost work1]# su user1 <-- 切换到 user1,发现无法使用 WORKDIR 自定义变量
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost ~]$ echo $WORKDIR
[user1@localhost ~]$ exit <--退出user1身份
[root@localhost work1]# export WORKDIR
[root@localhost work1]# su user1
[user1@localhost ~]$ cd $WORKDIR
[user1@localhost work1]$ pwd
/home/work1
使用Ubuntu 进行开发绕不开的就是环境变量的配置,由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,如果不了解其调用顺序,很有可能遇到配置了环境变量,而没有其作用的问题。本文将介绍Ubuntu Linux系统的环境变量。
一、Ubuntu Linux系统环境变量配置文件
Ubuntu Linux系统环境变量配置文件分为两种:系统级文件和用户级文件,下面详细介绍环境变量的配置文件。
1.系统级文件:
/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。这个文件一般就是调用/etc/bash.bashrc文件。
/etc/bash.bashrc:系统级的bashrc文件,为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
/etc/environment: 在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
2.用户级文件:
~/.profile: 在登录时用到的第三个文件 是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率 上讲不好。
~/.bash_profile:每个用户都可使用该文件输入专用于自己 使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
~./bash_login:不推荐使用这个,这些不会影响图形界面。而且.bash_profile优先级比bash_login高。当它们存在时,登录shell启动时会读取它们。
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
~/.pam_environment:用户级的环境变量设置文件。
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
二、/etc/profile与/etc /enviroment的比较
首先来做一个实验:
先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文。将/etc/profile中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。
用户环境建立的过程中总是先执行/etc/profile然后在读取/etc/environment。为什么会有如上所叙的不同呢?
应该是先执行/etc/environment,后执行/etc/profile。
/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。
系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,比如日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。
对于用户的SHELL初始化而言是先执行/etc/profile, 再读取文件/etc/environment.
对整个系统而言是先执行/etc/environment。这样理解正确吗?
/etc/enviroment -->/etc/profile --> $HOME/.profile -->$HOME/.env (如果存在)
/etc/profile 是所有用户的环境变量
/etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是
/etc/profile ->/etc/enviroment -->$HOME/.profile-->$HOME/.env
原因应该是用户环境和系统环境的区别了
如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment) 有不同的值那应该是以用户环境为准了。
备注:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。
在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动/etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。因为在 ~/.bash_profile文件中一般会有下面的代码:
if[ -f ~/.bashrc ] ; then
../bashrc
fi
~/.bashrc中,一般还会有以下代码:
if[ -f /etc/bashrc ] ; then
./bashrc
fi
所以,~/.bashrc会调用/etc/bashrc文件。最后,在退出shell时,还会执行~/.bash_logout文件。
执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc-> /etc/bashrc -> ~/.bash_logout
三、设置环境变量的方法
由以上分析可知:
/etc/profile全局的,随系统启动设置【设置这个文件是一劳永逸的办法】
/root/.profile和/home/myname/.profile只对当前窗口有效。
/root/.bashrc和 /home/yourname/.bashrc随系统启动,设置用户的环境变量【平时设置这个文件就可以了】
那么要配置Ubuntu的环境变量,就是在这几个配置文件中找一个合适的文件进行操作了;如想将一个路径加入到$PATH中,可以由下面这样几种添加方法:
1.控制台中:
$PATH="$PATH:/my_new_path" (关闭shell,会还原PATH)
2.修改profile文件:
$sudo gedit /etc/profile
在里面加入:
exportPATH="$PATH:/my_new_path"
3.修改.bashrc文件:
$ sudo gedit /root/.bashrc
在里面加入:
export PATH="$PATH:/my_new_path"
后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
$ echo $PATH
输出已经是新路径了。
举个列子,如果想把当前路径加入到环境变量中去,就可以这样做:
$ PATH ="$PATH:."
这样运行自己编写的shell脚本时就可以不输入./了
四、小结
综上所述,在Ubuntu 系统中/etc/profile文件是全局的环境变量配置文件,它适用于所有的shell。在我们登陆Linux系统时,首先启动/etc/profile文件,然后再启动用户目录下的~/.bash_profile、~/.bash_login或~/.profile文件中的其中一个,执行的顺序和上面的排序一样。如果~/.bash_profile文件存在的话,一般还会执行~/.bashrc文件。
环境变量在实际使用中的一些例子:
例如一些共性的底层依赖的软件,例如jdk,git, 这些软件只需要安装一遍,不是所有的用户都需要重复安装,当存在不同的用户都需要使用共同的软件,但每个用户会以自己的身份去运行的时候,可以通过系统级环境变量让子账户也能快速找到找个软件