Linux的变量可分为两类:环境变量和本地变量
环境变量,或则称为全局变量,存在与所有的shell中,在你登入系统的时侯就早已有了相应的系统定义的环境变量了。Linux的环境变量具有承继性linux 和 su 的使用 环境变量详解,即子shell会承继父shell的环境变量。
本地变量,当前shell中的变量,很其实本地变量中肯定包含环境变量。Linux的本地变量的非环境变量不具备承继性。
Linux中环境变量的文件
当你步入系统的时侯,linux都会为你读入系统的环境变量,这种环境变量储存在哪些地方,那就是环境变量的文件中。Linux中有好多记载环境变量的文件,它们被系统读入是根据一定的次序的。
1./etc/profile:
此文件为系统的环境变量linux桌面,它为每位用户设置环境信息,当用户第一次登陆时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。
这个文件,是任何用户登录操作系统之后就会读取的文件(假如用户的shell是csh、tcsh、zsh,则不会读取此文件),用于获取系统的环境变量,只在登录的时侯读取一次。
假定用户使用的是BASH,这么
2./etc/bashrc:
在执行完/etc/profile内容以后,假如用户的SHELL运行的是bash,这么接着才会执行此文件。另外,当每次一个新的bashshell被打开时,该文件被读取。
每位使用bash的用户在登入之后执行完/etc/profile中内容之后就会执行此文件,在新开一个bash的时侯也会执行此文件。为此,假如你想让每位使用bash的用户每新开一个bash和每次登入都执行个别操作,或则给她们定义一些新的环境变量,就可以在这个上面设置。
3.~/.bash_profile:
每位用户都可使用该文件输入专用于自己使用的shell信息。当用户登入时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc文件。
单个用户此文件的更改只会影响到他之后的每一次登录系统。为此,可以在这儿设置单个用户的特殊的环境变量或则特殊的操作,这么它在每次登入的时侯就会去获取这种新的环境变量或则做个别特殊的操作,并且仅仅在登录时。
4.~/.bashrc:
该文件包含专用于单个人的bashshell的bash信息,当登陆时以及每次打开一个新的shell时,该该文件被读取。
单个用户此文件的更改会影响到他之后的每一次登录系统和每一次新开一个bash。为此,可以在这儿设置单个用户的特殊的环境变量或则特殊的操作,这么每次它新登录系统或则新开一个bash,还会去获取相应的特殊的环境变量和特殊操作。
~/.bash_logout:
当每次退出系统(退出bashshell)时,执行该文件。
几个命令
env和printenv
这两个变量用于复印所有的环境变量:
set
用于显示与设置当前本地变量。单独一个set就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量
unset
用于去除变量。不管这个变量是环境变量还是本地变量,它都可以消除。
--下边是消除本地变量
[oracle@devdb1oracle]$set|grepmyname
myname=ilonng
[oracle@devdb1oracle]$unsetmyname
[oracle@devdb1oracle]$set|grepmyname
--下边是去除环境变量
[oracle@devdb1oracle]$env|grepmyname
myname=ilonng
[oracle@devdb1oracle]$unsetmyname
[oracle@devdb1oracle]$env|grepmyname
export
用于把变量弄成当前shell和其子shell的环境变量,存活期是当前的shell及其子shell,因而重新登录之后,它所设定的环境变量就消失了。怎样将环境变量永久化?更改前面介绍的那几个环境变量的配置文件
source
当直接执行一个脚本的时侯,虽然是在一个子shell环境运行的,即开启了一个子shell来执行这个脚本,脚本执行完后该子shell手动退出。
有没有办法在当前shell中执行一个脚本呢?使用source命令就可以让脚本在当前shell中执行。如:
[oracle@dbamonitorNBU]$cattest.sh--查看脚本内容,显示变量内容
echo$myname
[oracle@dbamonitorNBU]$echo$myname--变量存在,内容是ilonng
ilonng
[oracle@dbamonitorNBU]$set|grepmyname--变量是本地变量
myname=ilonng
[oracle@dbamonitorNBU]$env|grepmyname--变量不是环境变量
[oracle@dbamonitorNBU]$shtest.sh--直接执行,新开子shell,非环境变量的本地变量不具备承继性,在子shell中不可见
--这儿哪些都没有输出
一、Shell变量分为本地变量和环境变量。
1、本地变量--在用户现有运行的脚本中使用
1)定义本地变量格式:variable-name=value
事例:[root@jike1/root]#LOCALTEST="test"
[root@jike1/root]#echo$LOCALTESTtest
2)显示本地变量格式:set
事例:[root@chinaitlabroot]#set
3)消除本地变量格式:unsetvariable-name
比如:[root@jike1/root]#unsetLOCALTEST
此时再执行echo$LOCALTEST将看不到变量LOCALTEST的输出。
2、环境变量--在所有的子进程中使用
1)定义环境变量格式:exportvariable-name=value(与本地变量的定义相比,多了一个export关键字)
事例:[root@chinaitlab/root]#exportDOMAIN=""
[root@chinaitlabshell]#vitestenv.sh
#!/bin/bash
echo$DOMAIN
[root@chinaitlabshell]#chmod+xtestenv.sh
[root@chinaitlabshell]#./testenv.sh
2)显示环境变量格式:env(本地变量的显示使用setlinux 和 su 的使用 环境变量详解,环境变量的显示使用env)
事例:[root@chinaitlabtest]#env
3)去除环境变量格式:unsetvariable-name(用法与本地变量相同,都使用unset)
事例:[root@chinaitlabshell]#unsetDOMAIN
此时再执行./testenv.sh将看不到变量DOMAIN的输出。
---------------------------------------------------------------------------------------------------------------------
用户登入后加载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,完成终端属性和按键映射的设定.
其中PATH这个变量特殊说明一下:
若果是超级用户登陆,在没有执行/etc/profile之前,PATH早已设定了下边的路径:
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
若果是普通用户,PATH在/etc/profile执行之前设定了以下的路径:
/usr/local/bin:/bin:/usr/bin
这儿要注意的是:在用户切换并加载变量,比如su-,这时,假若用户自己切换自己,例如root用户再用su-root切换的话,加载的PATH和里面的不一样.
确切的说,是不总是一样.所以,在/etc/profile脚本中马哥linux,做了如下的配置:
if[`id-u`=0];then
pathmunge/sbin
pathmunge/usr/sbin
pathmunge/usr/local/sbin
fi
若果是超级用户登陆,在/etc/profile.d/krb5.sh脚本中,在PATH变量搜索路径的最上面降低/usr/kerberos/sbin:/usr/kerberos/bin
若果是普通用户登陆,在/etc/profile.d/krb5.sh脚本中,在PATH变量搜索路径的最上面降低/usr/kerberos/bin
在/etc/profile脚本中,会在PATH变量的最后降低/usr/X11R6/bin目录
在$HOME/.bash_profile中,会在PATH变量的最后降低$HOME/bin目录
以root用户为例,最终的PATH会是这样(没有其它自定义的基础上)
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
以alice用户(普通用户)为例
/usr/kerberos/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/alice/bin
----------------------------------------------------------------------------------------------------------------------------------
~/.bash_profile用户登入时被读取,其中包含的命令被执行
~/.bashrc启动新的shell时被读取,并执行
~/.bash_logoutshell登陆退出时被读取