Chinaunix首页 | 论坛 | 博客
  • 博客访问: 302569
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: LINUX

2015-06-10 20:36:55

bash的环境配置文件

login shell:取得bash时需要完整的登陆流程的,就称为login shell。举例来说,你要有tty1~tty6登陆,需要输入用户的账号与密码,此时取得的bash就称为login shell。
non-login shell:取得bash接口的方法不需要重复登陆的举动,举例来说,你以X window登陆linux后,再以x的同行界面启动终端机,此时那个终端接口并没有需要再次输入账号与密码,那个bash的环境称为non-login shell了。你在原本的bash环境下再次执行bash这个命令,同样也没有输入账号密码,那第二个bash(子进程)也是non-login shell。

login shell与non-login shell这个两个取得bash的情况中,读取的配置文件数据并不一样。


先学习login shell,loginshell其实只会读取这两个配置文件

/etc/profile:这是系统整体的设置,你最好不要修改这个文件
~/bash_profile或~/.bash_login或~/.profile:属于用户个人设置,你要改该用户的环境配置数据,就写入这里。

文件介绍
/etc/profile(login shell才会读)
这个配置文件可以利用用户的标识符(UID)来决定很多重要的变量数据,这也是每个用户登录取得bash是一定会读取的配置文件。所以如果你想要帮所有用户设置整体环境,那就在这里修改。不过没事还是不要随便改这个文件
PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录
MAIL:依据账号设置好用户的mailbox到/var/spool/mail/账号名;
USER:根据用户的账号设置此变量的内容;
HOSTNAME:依据主机的hostname命令决定此变量内容
HOSTSIZE:历史命令记录条数。


/etc/profile可不止会做这些事而已,它还会去调用外部的设置数据。默认的情况下,下面这些数据会被依次被调用进来:
1、/etc/inputrc:/etc/profile会主动判断用户有没有自定义输入的按键功能,如果没有的话(如何判断,profile文件中应该有判断语句),/etc/profile就会决定设置“INPUTRC=/etc/inputrc”。此文件内容为bash的热键、tab有没有声音等
2、/etc/profile.d/*.sh:其实*.sh是指这个目录内的众多文件。只要在/etc/profile.d/这个目录内且扩展名为.sh,另外用户能够具有r的权限,那么该文件就会被/etc/profile调用。这个目录下的文件规定了bash操作接口的颜色、语系、ll与ls命令的命令别名、vi的命令别名、which的命令别名等。如果你需要帮所有用户设置一些共享的命令别名时,可以在这个目录下面自行创建扩展名为.sh的文件,并将所需要的数据写入即可,我发现了这个目录下有一个vim.sh的文件,下面是内容,是否也代表有了vi=vim这个别名设置,小马哥告诉我要看前面的执行语句,也许早已返回,没有执行最下面的alias命令就已经将脚本执行完了,所以vi的别名没有被赋予。
  1. [root@RHEL6 profile.d]# more vim.sh 
  2. if [ -"$BASH_VERSION" --"$KSH_VERSION" --"$ZSH_VERSION" ]; then
  3.   [ -/usr/bin/id ] || return
  4.   ID=`/usr/bin/id -u`
  5.   [ -"$ID" -"$ID" -le 200 ] && return
  6.   # for bash and zsh, only if no alias is already set
  7.   alias vi >/dev/null 2>&|| alias vi=vim //这个命令的解释是alias vi这个命令别名是否设置,如果未设置就执行后面的赋予别名的命令,如果设置了就不执行
  8. fi
3、/etc/sysconfig/i18n:这个文件是由/etc/profile.d/lang.sh调用的,也就是我们决定bash默认使用何种语系的重要配置文件。文件里最重要的就是LANG这个变量的设置。
bash的login shell情况下所读取的整体环境配置文件其实只有/etc/profile,但是/etc/profile还会调用其他的配置文件。

个人偏好环境配置文件
~/.bash_profile(login shell才会读)
bash在读完了整体环境设置的/etc/profile并借此调用其他配置文件后,接下来则会读取用户的个人配置文件。在login shell的bash环境中,所读取的个人偏好配置文件其实有三个,依次是:
~/.bash_profile
~/.bash_login
~/.profile
其实bash的login shell设置只要读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序,也就是说如果~/.bash_profile存在,那么其他两个文件无论有没有存在,都不会被读取。如果~/.bash_profile不存在,才会去读~/.bash_login,而前两者都不存在才会读取~/.profile,我的RHEL6.4 root家目录下只有.bash_profile文件,其他用户也是只有这一个文件,为什么会有这么多文件,其实是按照其他shell转换过来的用户的习惯而已。
/root/.bash_profile文件内容,与其他用户默认都是一样的
  1. [root@awake ~]# more .bash_profile 
  2. .bash_profile


  3. Get the aliases and functions
  4. if [ -~/.bashrc ]; then //下面三行判断并读取~/.bashrc
  5.         . ~/.bashrc
  6. fi


  7. # User specific environment and startup programs//下面这几行处理个人化设置


  8. PATH=$PATH:$HOME/bin //设置这个用户的PATH变量,而且还是用了export将PATH变成环境变量。由于PATH在/etc/profile当中已经设置过,所以在这里就以累加的方式添加用户主文件下的~/bin为额外的执行文件放置目录。也就是说,你可以将自己创建的执行文件放置在自己主文件夹下的~/bin/目录。那就可以直接执行该执行文件而不需要使用绝对/相对路径来执行该文件。


  9. export PATH //将PATH变成环境变量
  10. [root@awake ~]#
上面的if...then语句是指,判断主文件夹下的~/.bashrc是否存在,若存在则读入~/.bashrc设置。
整个login shell读取环境配置文件的流程图


实线的方向是主线流程,虚线的方向则是被调用的配置文件。从上面我们可以清楚地知道,login shell环境下,最终被读取的配置文件是“~/.bashrc”文件,所以你当然可以将自己的偏好设置写入该文件即可.

source:读入环境配置文件的命令
由于/etc/profile与~/.bash_profile都是在取得login shell的时候才会读取的配置文件,所以如果你改变了两个文件内容,通常都是的注销在登录后该设置才会生效。那么能不能直接读取配置文件而不注销登录呢?使用sourc和.命令吧
  1. [root@awake ~]# more .bashrc
  2. # .bashrc

  3. # User specific aliases and functions  //用户的个人设置

  4. alias rm='rm -i'
  5. alias cp='cp -i'
  6. alias mv='mv -i'
  7. alias vi='vim'                   //这一行是我后加入的

  8. # Source global definitions      //整体的环境设置
  9. if [ -f /etc/bashrc ]; then
  10.         . /etc/bashrc
  11. fi
  12. [root@awake ~]# . .bashrc        //利用小数点(.)可以将环境配置文件读入到当前的shell环境中。
  13. [root@awake ~]# alias vi         //查看vi的别名,发现已经设置了
  14. alias vi='vim'
  15. [root@awake ~]# source .bashrc   //利用source命令与小数点命令功能相同
  16. [root@awake ~]# alias vi
  17. alias vi='vim'
  18. [root@awake ~]#
有了source和小数点命令系统就可以使用不同的环境配置文件,使用哪个时就引入哪个。


non-login shell,仅会读取~/.bashrc

~/.bashrc还会主动调用/etc/bashrc这个文件。/etc/bashrc帮我们定义出一下数据:
依据不同的UID规定umask的值
依据不同的UID规定提示符(就是PS1变量
调用/etc/profile.d/*.sh的设置
由于这个~/.bashrc会调用/etc/bashrc及/etc/profile.d/*.sh,所以万一你没有了~/.bashrc(可能不小心删除了它,还有一种常见的可能是你在/etc/passwd文件中直接修改已有的用户的用户名时,也会碰到),那么你会发现你的bash提示符可能会变成这个样子
  1. [root@awake ~]# su - ll    //ll是一个用户
  2. su: warning: cannot change directory to /home/ll: No such file or directory
  3. -bash-4.1$      //怪怪的命令提示符
上面的原因是没有了家目录,因此也没有了~/.bashrc,也就不能调用/etc/bashrc来规定PS1变量,这样的情况不会影响你的bash使用,如果你想要将命令提示符调回来
  1. [root@awake ~]# su - ll
  2. su: warning: cannot change directory to /home/ll: No such file or directory
  3. -bash-4.1$ . /etc/bashrc //执行这个./etc/bashrc命令也可以,只是下次登录系统还是没有命令提示符。嘿嘿!
  4. [ll@awake root]$     //发现没有,命令提示是$,而[]中有root,哈哈!

,那么可以复制/etc/skel/.bashrc到你的家目录,在修改一下你所想要的内容。并使用source去调用~/.bashrc,那么你的命令提示符就会回来。

其他相关环境配置文件
/etc/man.config:如果你是以tarball的方式安装的数据,那么你的man page可能会放置在/usr/local/softpackage/man里头,这个时候你就需要手动方式将该路径加到/etc/man.config中。否则用man时会找不到相关的说明文件。
~/.bash_history:默认情况下我们的历史命令就记录在这里,记录几条数据则与HISTSIZE这个变量相关。
~/.bash_logout:当我注销bash后系统再帮我完成什么后续的操作才离开,发现只有空行,也就是默认情况下,注销bash时只是清掉屏幕的信息而已。不过你也可以将一些备份或者其他认为重要的工作在这个文件中,例如清空暂存盘,那么当你离开linux时,就可以解决一些烦人的事情。

阅读(2172) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~