CentOS中环境变量和配置文件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CentOS中环境变量和配置⽂件
什么是环境变量
bash shell⽤⼀个叫做 环境变量(environment variable) 的特性来存储有关shell会话和⼯作环境的信息。

即允许在内存中存储数据,使得在程序或shell中运⾏的脚本能够访问它们。

在bash shell中,环境变量分为两类:
全局变量
局部变量
全局环境变量
全局环境变量对于shell会话和所有⽣成的⼦shell都是可见的。

局部变量则只对创建它们的shell可见。

查看全局变量,可以使⽤env或printenv命令。

[root@dev ~]# env
HOSTNAME=localhost
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.100.17 56344 22
SSH_TTY=/dev/pts/0
USER=root
[root@dev ~]#
[root@dev ~]# printenv
HOSTNAME=localhost
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.100.17 56344 22
SSH_TTY=/dev/pts/0
USER=root
[root@dev ~]# printenv TERM
linux
使⽤环境变量,通过 $ +变量名。

[root@dev ~]# echo $HOME
/root
系统环境变量基本上都是使⽤⼤写字母,以区别于普通⽤户的环境变量。

局部环境变量
顾名思义,局部环境变量只能在定义它们的进程中可见。

set命令会显⽰某个特定进程设置的所有环境变量,包括局部变量、全局变量以及⽤户定义变量。

[root@dev ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=165
⽤户定义变量
⼀旦启动了bash shell,就能创建在这个shell进程内可见的局部变量。

该进程创建的⼦shell⽆法读取⽗shell的局部变量。

[root@dev shell]# sh a.sh
2
22
2
[root@dev shell]# cat a.sh
#!/bin/bash
a=1;
export b=2;
sh b.sh
echo $b;
[root@dev shell]# cat b.sh
#!/bin/bash
echo $a;
echo $b;
b=22;
echo $b;
[root@dev shell]# sh a.sh
2
22
2
⽤户可以通过export变量,使变量变为全局变量,这样⼦shell也可以读取到。

⽽⼦shell修改该变量,⽗shell中不受影响。

如果在⼦shell中设置环境变量,想要在⽗shell中读取呢?
⼀个使⽤场景是:多个执⾏脚本依赖于共同的环境配置,这个配置写在⼀个env.sh脚本⾥,如何使其他执⾏脚本可以读取到env.sh⾥变量?在⼦shell中export变量,并不能影响到⽗shell。

source命令(从 C Shell ⽽来)是bash shell的内置命令。

点命令,就是⼀个点符号,(从Bourne Shell⽽来)是source的另⼀名称。

这两个命令都以⼀个脚本为参数,该脚本将作为当前shell的环境执⾏,即不会启动⼀个新的⼦进程。

所有在脚本中设置的变量将成为当前Shell的⼀部分。

[root@dev shell]# cat c.sh
. ./env.sh
source ./profile.sh
echo $env;
echo $profile;
[root@dev shell]# cat env.sh
env='test';
[root@dev shell]# cat profile.sh
profile="dev";
[root@dev shell]# sh c.sh
test
dev
如果想要删除环境变量
unset var_name
设置全局环境变量
上⽂中,可以知道,如果想要在本进程和⼦进程中使⽤共同的环境变量。

通过source命令去读取同⼀个环境变量脚本可以实现。

这是⽤户⾃定义的⽅案。

但很多时候,我们需要读取的全局环境变量并不知道source,所以需要⼀个默认的环境变量读取⽂件。

当你登录Linux系统时,bash shell会作为登录shell启动。

登录shell会从5个不同的启动⽂件⾥读取
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
/etc/profile
/etc/profile⽂件是bash shell默认的主启动⽂件。

只要你登录了Linux系统,bash就会执⾏/etc/profile启动⽂件的命令。

[root@dev shell]# cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`id -u`
UID=`id -ru`
fi
USER="`id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi
HOSTNAME=`/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null 2>&1
fi
fi
done
unset i
unset -f pathmunge
该⽂件会读取/etc/profile.d/下所有的*.sh⽂件,通过点命令(source)来加载变量。

即在/etc/profile和/etc/profile.d/*.sh定义的变量,都是全局的系统环境变量。

$HOME/.bash_profile
$HOME下的启动⽂件都是⽤户专属的启动⽂件,定义该⽤户的环境变量。

⽽/etc/profile则是系统的,所有⽤户的环境变量。

shell会按照下列顺序,运⾏第⼀个找到的⽂件,余下被忽略:
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
.bashrc通过.bash_profile来调⽤。

[root@dev shell]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
总结:
将要设置的系统全局环境变量,⽐如JAVA_HOME,放在/etc/profile.d/⽬录下, 以*.sh脚本的形式定义。

相关文档
最新文档