profile与bashrc的深入分析.docx
《profile与bashrc的深入分析.docx》由会员分享,可在线阅读,更多相关《profile与bashrc的深入分析.docx(9页珍藏版)》请在冰豆网上搜索。
profile与bashrc的深入分析
/etc/profile:
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:
为每一个运行bashshell的用户执行此文件.当bashshell被打开时,该文件被读取.
~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!
默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:
该文件包含专用于你的bashshell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
~/.bash_logout:
当每次退出系统(退出bashshell)时,执行该文件.
另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
~/.bash_profile是交互式、login方式进入bash运行的
~/.bashrc是交互式non-login方式进入bash运行的
通常二者设置大致相同,所以通常前者会调用后者。
*每次bash作为loginshell启动时会执行.bash_profile。
主要有(我所知道的)有以下几种情形:
a)每次登录到服务器时默认启动的shell
b)“su-l[USER]”时进入的shell
c)“bash--login”进入的shell
*每次bash作为普通的交互shell(interactiveshell)启动时会执行.bashrc
常见的有:
i)“su[USER]”进入的shell
ii)直接运行“bash”命令进入的shell。
**注意
1,在shell脚本中“#!
/usr/bin/bash”启动的bash并不执行.bashrc。
因为这里的bash不是
interactiveshell。
2,bash作为loginshell(loginbash)启动时并不执行.bashrc。
虽然该shell也是interactiveshell,
但它不是普通的shell。
*一般.bash_profile里都会调用.bashrc
尽管loginbash启动时不会自动执行.bashrc,惯例上会在.bash_profile中显式调用.bashrc。
-------------------------------------
|if[-f~/.bashrc];then
| .~/.bashrc
|fi
`-------------------------------------
.bash_profile显示内容如下:
#.bash_profile
#Getthealiasesandfunctions
if[-f~/.bashrc];then
.~/.bashrc
fi
#Userspecificenvironmentandstartupprograms
PATH=.:
$PATH:
$HOME/bin
BASH_ENV=$HOME/.bashrc
USERNAME="root"
exportUSERNAMEBASH_ENVPATH
用户登录后加载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脚本中,做了如下的配置:
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
下面是做的脚本解析:
###############################################
#strace-osu-etrace=opensu-alice
#grep^open/etc/su|grep-vnull|grep"=3"|nl
###############################################
打开的文件如下:
1 open("/etc/ld.so.cache",O_RDONLY) =3
2 open("/lib/libcrypt.so.1",O_RDONLY) =3
3 open("/lib/tls/libc.so.6",O_RDONLY) =3
4 open("/usr/lib/locale/locale-archive",O_RDONLY|O_LARGEFILE)=3
5 open("/etc/nsswitch.conf",O_RDONLY) =3
6 open("/etc/ld.so.cache",O_RDONLY) =3
7 open("/lib/libnss_files.so.2",O_RDONLY)=3
8 open("/etc/passwd",O_RDONLY) =3
9 open("/etc/shadow",O_RDONLY) =3
10 open("/etc/group",O_RDONLY) =3
11 open("/etc/ld.so.cache",O_RDONLY) =3
12 open("/lib/libtermcap.so.2",O_RDONLY) =3
13 open("/lib/libdl.so.2",O_RDONLY) =3
14 open("/lib/tls/libc.so.6",O_RDONLY) =3
15 open("/dev/tty",O_RDWR|O_NONBLOCK|O_LARGEFILE)=3
16 open("/etc/mtab",O_RDONLY) =3
17 open("/proc/meminfo",O_RDONLY) =3
18 open("/etc/nsswitch.conf",O_RDONLY) =3
19 open("/etc/ld.so.cache",O_RDONLY) =3
20 open("/lib/libnss_files.so.2",O_RDONLY)=3
21 open("/etc/passwd",O_RDONLY) =3
22 open("/etc/profile",O_RDONLY|O_LARGEFILE)=3
23 open("/etc/profile.d/",O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY)=3
24 open("/etc/profile.d/colorls.sh",O_RDONLY|O_LARGEFILE)=3
25 open(".",O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY)=3
26 open("/etc/profile.d/glib2.sh",O_RDONLY|O_LARGEFILE)=3
27 open("/etc/profile.d/gnome-ssh-askpass.sh",O_RDONLY|O_LARGEFILE)=3
28 open("/etc/profile.d/krb5.sh",O_RDONLY|O_LARGEFILE)=3
29 open("/etc/profile.d/lang.sh",O_RDONLY|O_LARGEFILE)=3
30 open("/etc/sysconfig/i18n",O_RDONLY|O_LARGEFILE)=3
31 open("/usr/lib/locale/locale-archive",O_RDONLY|O_LARGEFILE)=3
32 open("/usr/lib/gconv/gconv-modules.cache",O_RDONLY)=3
33 open("/etc/profile.d/less.sh",O_RDONLY|O_LARGEFILE)=3
34 open("/etc/profile.d/qt.sh",O_RDONLY|O_LARGEFILE)=3
35 open("/etc/profile.d/vim.sh",O_RDONLY|O_LARGEFILE)=3
36 open("/etc/profile.d/which-2.sh",O_RDONLY|O_LARGEFILE)=3
37 open("/ceno/product/imeg/etc/profile",O_RDONLY|O_LARGEFILE)=3
38 open("/home/alice/.bash_profile",O_RDONLY|O_LARGEFILE)=3
39 open("/home/alice/.bashrc",O_RDONLY|O_LARGEFILE)=3
40 open("/etc/bashrc",O_RDONLY|O_LARGEFILE)=3
41 open("/home/alice/.bash_history",O_RDONLY|O_LARGEFILE)=3
42 open("/home/alice/.bash_history",O_RDONLY|O_LARGEFILE)=3
43 open("/etc/termcap",O_RDONLY) =3
44 open("/etc/inputrc",O_RDONLY|O_LARGEFILE)=3
45 open(".",O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY)=3
46 open("/home/alice/.bash_logout",O_RDONLY|O_LARGEFILE)=3
47 open("/home/alice/.bash_history",O_WRONLY|O_APPEND|O_LARGEFILE)=3
48 open("/home/alice/.bash_history",O_RDONLY|O_LARGEFILE)=3
########################################################
第一部分:
从1-21行基本是打开动态链接库文件和身份验证的文件.
########################################################
########################################################
第二部分:
第22行是打开/etc/profile文件,如下:
########################################################
#/etc/profile
#Systemwideenvironmentandstartupprograms,forloginsetup
#Functionsandaliasesgoin/etc/bashrc
########################################################
#定义pathmunge函数
#echo$PATH|/bin/egrep-q"(^|:
)$1($|:
)"是过滤$PATH中的可执行目录,如果egrep到批配项,返回真但取反
#也就是不增加执行目录到$PATH中,选项-q禁止所有的输出到标准输出,不管匹配行。
如果选中输入行,以0状态退出
#这里由|(竖线)或者换行符隔开的多个正则表达式会匹配与任何一个正则表达式所匹配的字符串
#一个正则表达式可以被包括在“()”(括弧)中进行分组
########################################################
pathmunge(){
if!
echo$PATH|/bin/egrep-q"(^|:
)$1($|:
)";then
if["$2"="after"];then
PATH=$PATH:
$1
else
PATH=$1:
$PATH
fi
fi
}
###########################################
#如果uid为0的用户,将在$PATH变量上加入/sbin/,/usr/sbin,/usr/local/sbin三个目录-q"(^|:
)($|:
)"
#因为调用pathmunge函数,没有加入after参数,所以以上三个目录都加在了$PATH变量的最前面
###########################################
#Pathmanipulation
if[`id-u`=0];then
pathmunge/sbin
pathmunge/usr/sbin
pathmunge/usr/local/sbin
fi
##########################################
#调用pathmunge函数,在$PATH后面增加/usr/X11R6/bin
##########################################
pathmunge/usr/X11R6/binafter
unsetpathmunge
##########################################
#ulimit设定-S为软控制,-c为corefile文件大小,这里是不做限制
##########################################
#Nocorefilesbydefault
ulimit-S-c0>/dev/null2>&1
##########################################
#id-un是打印输出当前的用户名,例如:
root
#定义了LOGNAME变量和MAIL变量,会有程序用到这些变量
##########################################
USER="`id-un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
##########################################
#通过/bin/hostname获取主机名
#定义history的记录数为1000
##########################################
HOSTNAME=`/bin/hostname`
HISTSIZE=1000
##########################################
#如果没有定义$INPUTRC并且不存在$HOME/.inputrc文件
#定义变量INPUTRC的值为/etc/inputrc
##########################################
if[-z"$INPUTRC"-a!
-f"$HOME/.inputrc"];then
INPUTRC=/etc/inputrc
fi
exportREMOTE_JAVA_DEBUG=on
exportPATHUSERLOGNAMEMAILHOSTNAMEHISTSIZEINPUTRC
##########################################
#执行/etc/profile.d/下的所有脚本,-r是确认它们可读
##########################################
foriin/etc/profile.d/*.sh;do
if[-r"$i"];then
.$i
fi
done
unseti
./ceno/product/imeg/etc/profile
exportPS1="\[\e[32;1m\][\u@\h]\[\e[33;1m\]:
\[\e[31;1m\]\w>\\$\[\e[0m\]"
########################################################
第三部分:
从24行到36行是执行/etc/profile.d/下的所有脚本,这个执行过程在/etc/profile中定义.
见前面/etc/profile中的脚本分析.
下面是对/etc/profile.d/下脚本做的简要说明,主要设定了环境变量(例如:
PATH),alias等
/etc/profile.d/colorls.sh:
对/etc/DIR_COLORS的提取,并用dircolors进行设定,最后定义了一些ls的alias
/etc/profile.d/glib2.sh:
设定G_BROKEN_FILENAMES=1
/etc/profile.d/gnome-ssh-askpass.sh:
设定SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
/etc/profile.d/krb5.sh:
增加/usr/kerberos/bin或/usr/kerberos/sbin到PATH变量中
/etc/profile.d/lang.sh:
设定语言环境,首先会加载/etc/sysconfig/i18n中的环境变量(LANG,SUPPORTED,SYSFONT)到shell中,
根据以上的变量再定义语言环境支持子集,最后再根据LANG设定终端
/etc/profile.d/less.sh:
设定LESSOPEN="|/usr/bin/lesspipe.sh%s",LANGVAR=$LANG
/etc/profile.d/qt.sh:
设定QTDIR="/usr/lib/qt-3.1"
/etc/profile.d/vim.sh:
设定aliasvi=vim
/etc/profile.d/which-2.sh:
设定aliaswhich='alias|/usr/bin/which--tty-only--read-alias--show-dot--show-tilde'
########################################################
########################################################
第四部分:
第37行open("/ceno/product/imeg/etc/profile",O_RDONLY|O_LARGEFILE)=3,这里加载了用户自己的环境设定脚本.
########################################################
#######################