linux中环境变量及环境变量配置文件详解
环境变量:定义每个用户的操作环境
1. Source命令:修改配置文件后,必须注销重新登录才能生效,使用source命令后,立即生效环境变量配置文件;
命令如下:source 配置文件 或者 . 配置文件
2. 环境变量配置文件简介:环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等;PATH、HISTSIZE、PS1、HOSTNAME等环境变量写入对应的环境变量配置文件;
3. 常见的环境变量:
1. /etc/profile
2. /etc/profile.d/*.sh
3. ~/.bash_profile
4. ~/.bashrc
5. /etc/bashrc
注:放在家目录(3,4)下的环境变量配置文件,只会对当前用户起作用;在/etc下的环境变量所有的用户都起作用;
环境变量配置文件的功能
系统正常启动过程的环境变量的启动
先向下走,在向右走;
在其他用户下切换用户的过程
先向下,然后再向右;
一. /etc/profile的作用
1. USER变量:
2. LOGNAME变量:
3. MAIL变量:
4. PATH变量:
5. HOSTNAME变量:
6. HISTSIZE变量:
7. umask:
8. 调用/etc/profile.d/*.sh文件
二. umask #查看系统默认权限
1. 文件最高权限为666
2. 目录最好权限为777
3. 权限不能使用数字进行换算,而必须使用字母;使用的是最高权限丢点默认的权限;
Eg:当前默认权限为022,那么创建的文件权限就是最高权限减去默认权限:wr-wr-wr- 减去 ----w--w- 那么创建的文件权限默认为wr--r--r-
4. Umask定义的权限,是系统默认权限中准备丢弃的权限如022,也就是----w—w-
三.~/.bash_profile的作用
1.调用了~/.bashrc 文件
2.在PATH变量后面加入了”:$HOME/bin”这个目录
四./etc/bashrc的作用
1.PS1
2.umask
3.PATH变量
4.调用/etc/profile.d/*.sh文件
_______________________________________________________________________________________________________________________________________________________________________________
linux 下常见启动文件配置
先将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/.pro
/etc/profile 是所有用户的环境变量
/etc/enviroment是系统的环境变量
登陆系统时shell读取的顺序应该是
/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env
原因应该是jtw所说的用户环境和系统环境的区别了
如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment) 有不同的值那应该是以用户环境为准了。
(1)/etc/profile: 此文件为系统的每个用户 设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(2)/etc /bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
(3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己 使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
(4)~/.bashrc: 该文件包含专用于你 的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(5) ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
(6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
通过比较最后发现,在ubuntu下配置java运行环境时,所做的设置代表的意义了。
$ sudo vim /etc/profile
在文件最后添加
#set java environment
JAVA_HOME=/opt/jdk1.6.0_07
export JRE_HOME=/opt/jdk1.6.0_07/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
最后wq!
备注:在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
#################################################################
1.登录shell
所谓登录shell,指的是当用户登录系统时所取的那个 shell。登录shell属于交互式shell。
登录shell将查找4个不同的启动文件来处理其中的命令。 bash shell处理文件的顺序如下:
1: /etc/profile
2:/etc/profile.d等待配置文件
3: $HOME/.bash_profile
5 $HOME/.profile
/etc /profile是bash shell在系统上的主默认启动文 件,系统上 每一个用户在登陆时都将执行此文件。
其余3个文件具备相同的功能——提供特定于用户的启动文件。大多 数Linux版本只使用其中之一。如:RedFlag使用.bash_profile ubuntu使用.profile .
shell 依次查找~/.bash_profile、
如果启动了一个bash shell而没有等录系统(如在CLI提示符中键入bash),
在交互式非登录shell中并不执行前面提到的初始化文件中的命令。然而,交互式非登录shell从登录shell继承了由这些初始化文件设置的 shell变量。
(1) $HOME/.bashrc
交互式非登录shell执行~/.bashrc文件中的命令.在每次执行shell脚本时,都会重新读取这个文件,所以是最完整的。
但是万事都不是一样的,debain系列的是不同的,如ubuntu
/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
______________________________________________________________________________________________________________________________________________________________________________________
深入浅出理解交互式shell和非交互式shell、登录shell和非登录shell的区别
首先我们需要把bash理解为一种模式,我们不如把这种模式想象成类似于洋葱一样的结构,我们可以一层一层剥开,也就是说我们可以一层一层的进入子shell。就好比我们进入一栋楼,打开一个房间是一个环境,在当前这个房间我们又看到了一个门,当我们打开这个门的时候,我们就已经进入了新的环境,也就是新的bash中。这牵扯到一个父shell和子shell的问题。
(1)全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
(2)个人配置:
~/.bash_profile
~/.bashrc
我们可以根据shell是否是交互式和shell是否是登录式这两个维度,来对shell进行分类。
交互式shell和非交互式shell(interactive shell and non-interactive shell)
交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式,以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
举个例子,最常见的交互式shell,就是我们利用虚拟机登录Linux系统时的那个等待登录界面,大概如下图所示:
系统在等待我们键入登录的用户名和密码,这就是一种交互式shell,而非交互式shell就像我们写的那些很简单的脚本,比如一个脚本展示出:helloworld。这个脚本不需要我们对其进行交互,它就只是很简单的将其脚本中的命令按顺序执行。
登录式shell和非登录式shell
登录shell:是需要用户名、密码登录后才能进入的shell(或者通过--login”选项生成的shell)。
非登录shell:当然就不需要输入用户名和密码即可打开的Shell,例如:直接命令“bash”就是打开一个新的非登录shell,在Gnome或KDE中打开一个“终端”(terminal)窗口程序也是一个非登录shell。
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)。
交互式登录shell和非交互式登录shell的区别
交互式登录:(清除掉所有变量,通过文件重新读入)
(1)直接通过终端输入账号密码登录
(2)使用“su - UserName”切换的用户
执行顺序:(影响该shell的配置文件)
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile--> ~/.bashrc--> /etc/bashrc
非交互式登录:(会继承上一个shell的全部变量)
(1)su UserName
(2)图形界面下打开的终端
(3)执行脚本 (当我们执行脚本的时候.我们就已经进入到了一个子shell)
(4)任何其它的bash实例
执行顺序:(影响该shell的配置文件)
~/.bashrc--> /etc/bashrc--> /etc/profile.d/*.sh
使用./test.sh或者 bash ./test.sh执行脚本的时候,是开启一个子shell,这个子shell能继承上一个父shell的变量,而这个子shell的变量,随着子shell的退出而消失。当我们用. test.sh 或者source test.sh时,不开启子shell,在当前shell运行,子shell中的所有值都影响当前。
一般我们对shell进行一些配置的时候,通常都是对~/.bashrc 和/etc/bashrc这两个文件进行一些配置。