广东技术师范学院后院社区's Archiver

lvdbing 发表于 2008-3-19 16:17

Bash Shell-版本和环境

[b]开题:[/b] Shell作为系统同用户的交接口,是学习和工作的平台,它所占的地位是举足轻重的.而Bash Shell是作为GNU/Linux系统学习者必不可少的脚本编程语言.
    看别人写的教材,如果没有实际操作过的话,很容易就忘记了.我觉得比较好的办法就是看教材,然后自己的实际操作一次(当然练习多次,记忆更加深刻),并且把它给记录下来,到时候回头看的时候很快就可以进入当时学习的思路.
    目前使用的Linux版本是
[table=98%][tr][td][root@localhost ~]# [b]cat /etc/issue[/b]
CentOS release 4.3 (Final)
Kernel \r on an \m
[/td][/tr][/table]
[b]1.1 bash版本[/b]
确认你当前使用的bash版本,可以使用bash的--version选项或者打印环境变量BASH_VERSION.
[table=98%][tr][td][root@localhost ~]# [b]bash --version[/b]
GNU bash, version 3.00.15(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

[root@localhost ~]# [b]echo $BASH_VERSION[/b]
3.00.15(1)-release
[/td][/tr][/table]
[b]1.2 Shell启动[/b]
    系统启动后运行的第一个进程是init进程,它的进程PID是1.init派生一个getty进程。getty进程负责打开终端端口,提供标准输入的来源,和标准输出与标准错误输出的去处,并且在屏幕上显示一个登陆提示符.
    接下来是要执行/bin/login程序,login程序执行的以下工作:提示用户输入口令,加密并验证用户输入的口令,设置初始环境,启动用户登陆的Shell.
    Bash 进程首先查找系统文件/etc/profile,并且执行其中的命令.然后它在用户的主目录中查找一个名为.bash_profile的初始化文件.执行完.bash_profile中的命令后,bash shell接着在用户的ENV文件,通常叫做.bashrc,中执行一个命令.最后默认的美圆($)提示符将出现在屏幕上,如果是root用户则为(#)提示符.
[b]2.1 环境[/b]
    一个进程的环境包括:变量,打开的文件,当前的工作目录,函数,资源限额,信号等.它定义了可以从一个进程继承到下一个进程的特征,以及对当前工作环境的配置.
    登陆时,如果在用户的主目录下存在.bash_profile文件,就对其执行source命令.它先设置用户的别名和函数,再设置用户特定的环境变量以及启动脚本.
    如果用户没有.bash_profile文件,但有一个名为.bash_login文件,那么将对这个文件执行source命令,如果也没有.bash_login文件,而有一个.profile文件,就对这个.profile文件执行source命令.
[table=98%][tr][td][root@localhost ~]# [b]pwd[/b]
/root
[root@localhost ~]# ls .bash*
.bash_history  .bash_logout  .bash_profile  .bashrc

[root@localhost ~]# [b]man source[/b]
source filename [arguments]
     Read  and  execute  commands from filename in the current shell environment and return the exit status of the last command executed  from  filename.
[color=#ff0000](注: source命令是指读并且执行文件里的命令,并且是以当前shell的环境和返回执行完最有一个命令后的退出状态.)[/color]
[/td][/tr][/table]
    /etc/profile文件是一个系统级的初始化文件,由系统管理员进行设置,在用户登陆时执行指定的任务.这个文件在bash shell启动时被执行.
[table=98%][tr][td][root@localhost ~]# [b]cat -n /etc/profile[/b]
     1  # /etc/profile
     2
     3  # System wide environment and startup programs, for login setup
     4  # Functions and aliases go in /etc/bashrc
     5
     6  pathmunge () {
     7          if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
     8             if [ "$2" = "after" ] ; then
     9                PATH=$PATH:$1
    10             else
    11                PATH=$1:$PATH
    12             fi
    13          fi
    14  }
    15
    16  # Path manipulation
    17  if [ `id -u` = 0 ]; then
    18          pathmunge /sbin
    19          pathmunge /usr/sbin
    20          pathmunge /usr/local/sbin
    21  fi
    22
    23  pathmunge /usr/X11R6/bin after
    24
    25
    26  # No core files by default
    27  ulimit -S -c 0 > /dev/null 2>&1
    28
    29  USER="`id -un`"
    30  LOGNAME=$USER
    31  MAIL="/var/spool/mail/$USER"
    32
    33  HOSTNAME=`/bin/hostname`
    34  HISTSIZE=1000
    35
    36  if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    37      INPUTRC=/etc/inputrc
    38  fi
    39
    40  export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC
    41
    42  for i in /etc/profile.d/*.sh ; do
    43      if [ -r "$i" ]; then
    44          . $i
    45      fi
    46  done
    47
    48  unset i
    49  unset pathmunge

解析:  
6-14:定义一个函数 pathmunge(),输出路径变量PATH,并对输出做匹配,如果匹配非真时,则进入下一个条件判断语句,然后将函数pathmunge的第二个参数做判断,如果第二个参数等于after,则把第一个参数加入到路径变量PATH的后面,否则就将第一个参数加入到路径变量PATH的前面.                        
17-21:先判断登陆的用户UID是否为0,如果是的话则将/sbin,/usr/sbin,/usr/local/sbin加入到路径变量PATH前面.
23:把路径/usr/X11R6/bin加入到路径变量PATH后面.
27:设置软限制的core的最大值为0,并且把标准的输出或者标准的错误输出结果丢弃.
29-34:设置环境变量,包括USER(用户),LOGNAME(登陆名),MAIL(邮箱),HOSTNAME(主机名),HISTSIZE(历史命令条数).
36-38:判断变量INPUTRC没有付值并且在HOME目录用户主目录中没有.inputrc文件时,则把/etc/inputrc付值给变量INPUTRC.
40:输出这些变量,让当前的Shell或者派生的子Shell也可以识别.
42-46:如果/etc/profile.d/目录中所有以.sh结尾的脚本有执行权限,则用点(.)命令也就是source命令来执行/etc/profile.d/目录中所有以.sh结尾的这些脚本.
48-49:清除变量i和pathmunge.
[/td][/tr][/table]
    ~/.bash_profile文件,如果在用户的主目录找到~/.bash_profile,则将它在/etc/profile后执行source命令.如果用户没有~/.bash_profile文件,但有一个名为~/.bash_login文件,那么将对这个文件执行source命令,如果也没有~/.bash_login文件,而有一个~/.profile文件,就对这个~/.profile文件执行source命令.只能对这三个文件中的其中一个执行source命令.Bash还将检查用户是否有一个.bashrc文件并对它执行source命令.
[table=98%][tr][td][root@localhost ~]# [b]cat -n ~/.bash_profile[/b]
     1  # .bash_profile
     2
     3  # Get the aliases and functions
     4  if [ -f ~/.bashrc ]; then
     5          . ~/.bashrc
     6  fi
     7
     8  # User specific environment and startup programs
     9
    10  PATH=$PATH:$HOME/bin
    11
    12  export PATH
    13  unset USERNAME
解析:
4-6:先判断是否存在~/.bashrc文件,如果存在则执行source命令.
10:把用户的主目录的/bin目录加入到路径变量PATH中.
12:输出路径变量PATH给Shell环境.
13:注销USERNAME变量.
[/td][/tr][/table]
    .bashrc文件,每次当一个新的或交互式Bash Shell或bash脚本启动时自动对这个文件执行source命令。它包含那些只属于Bash Shell的设置。
[table=98%][tr][td][root@localhost ~]# [b]cat -n .bashrc[/b]
     1  # .bashrc
     2
     3  # User specific aliases and functions
     4
     5  alias rm='rm -i'
     6  alias cp='cp -i'
     7  alias mv='mv -i'
     8
     9  # Source global definitions
    10  if [ -f /etc/bashrc ]; then
    11          . /etc/bashrc
    12  fi

解析:
5-7:设置别名
10-12:如果存在文件/etc/bashrc则对其进行source命令。
[/td][/tr][/table]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.