8.1 介绍
8.1.2 开始
在引导系统时,第一个需要运行的进程就是init,PID#1。它衍生出一个getty终端过程,改过程打开一个终端端口,提供一块空间给标准输入,标准输出和标准错误,并把提示符显示在屏幕上。然后执行程序/bin/login.login程序提示输入密码,加密并验证密码,建立一个初始环境,启动登陆shell----/bin/bash----/etc/passwd文件的最后一项。Bash寻找系统文件/etc/profile并执行其中的命令,然后在用户目录下寻找名字叫作.bash_profile的初始化文件。执行完bash_profile中的命令后,就处理用户环境文件的命令,这个文件通常称为.bashrc,最后默认提示美元符合就显示在你的屏幕上,等待输入命令。
用chsh改变登陆shell
所以合法的shell清单都存储在/etc/shells文件中。
8.1.3 环境
一个进程的环境由变量,打开的文件,当前工作目录,函数,资源限制和信号等组成。
初始化文件
在登陆到系统,shell提示符出现在屏幕上以前,系统初始化文件/etc/profile就被读取了,接着,如果用户主目录下存在,bash_profile文件,那么这个文件也将被读取,它的作用时设置用户别名和函数,并建立用户知道环境变量和启动脚本。
如果用户没有.bash_profile文件,但是存在.bash_login文件,那么就会读取后者,如果后者不存在,但是有profile文件,那么就读取.profile文件。
初始化文件的处理顺序
if /etc/profile exists, source it,
if ~/.bash_profile exists,source it,
if ~/.bashrc exists,source it, #在这个过程中会执行/etc/bashrc文件。
else if ~/.bash_login exists,source it,
else if ~/.profile exists,source it.
/etc/profile文件。/etc/profile文件是由系统管理程序建立的一个泛系统的初始文件,用户登陆的时候就显示。Bash――启动该系统文件就执行。该文件对系统上的bourne shell和korn shell用户同样通用。它的功用是检查收件箱十分收到新邮件,并从/etc/motd调出当前日期加以显示。
(sample /etc/profile)
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
1 PATH="$PATH:/usr/X11R6/bin"
2 PS1="[u@hW]$"
3 ulimit -c 1000000
4 if [ 'id -gn' = 'id -un' -a 'id -u' -gt 14 ]; then
5 umask 022
else
umask 022
fi
6 USER=`id -un`
7 LOGNAME=$USER
8 MAIL="/var/spool/mail/$USER"
9 HOSTNAME=`/bin/hostname`
10 HISTSIZE=1000
11 HISTFILESIZE=1000
12 export PATH PS1 HOSTNAME HISTSIZE HOSTFILESIZE USER LOGNAME MALL
13 for i in /etc/profile.d/*.sh ; do
14 if [ -r "$i" ]; then
15 . $i
fi
16 done
17 unset i #
说明
1, shell从那里找到命令,就把该位置赋值给PATH变量。
2, 规定光标的基本显示形式。光标将以以下像是在shell窗口出现:用户名(u),@符号,主机名(W)及$符号。
3, Ulimit命令(shell内置命令)限制核心文件的最大容量为1000000字节。核心文件是破坏了的程序文件的转存,而且占用相当大的磁盘空间。
4, 该行是说,假如用户所属的组名和用户名一致,同时用户id号不大于14。。。(见解释5)。
5, 设置umask为022。若创建的是目录则得到755的权限,而文件得到664的权限。否则,umask被设置为022,此时则给予目录755的权限,或给文件644的权限。
6, 把用户名赋值给USER变量(id –un)。
7, LOGNAME变量被赋值给$USER的值。
8, 将到收件箱(存储新邮件)的路径赋值给MAIL变量。
9, 将用户主机名赋值给HOSTNAME变量。
10, 设定HISTSIZE变量为1000。HISTSIZE是用来控制历史记录的数量的。Shell退出后,shell将历史记录记录在历史文件里。
11, HISTSIZE使得历史的命令数最多为1000,
12, 当子shell和子进程需要时,这些变量就会被导出。
13, 对于在/etc/profile.d目录里的所以.sh文件….(见14)
14, 检查是否为可执行文件,如果是…(见15)
15, 用点命令来执行命令。在/etc/profile.d目录里的lang.sh和mc.sh文件分别设置linux的字体和字型,同时还创建mc的函数,可以用来激活一个名为midnight commander的浏览文件管理程序。在bash提示符下输入mc,来了解文件管理程序是如何工作的。
16, Done关键字标志for循环的结束。
17, 变量i 被复位,也就是说,将它从shell的名字作用域中删除。i 的值是在for循环里获取的,假如该循环顺利地为所有变量赋值的话。
~/.bash_profile文件。假如在用户的根目录里存在~/.bash_profile文件,bash就在/etc/profile后面发送~/.bash_profile。假如~/.bash_profile不存在,bash就查找另一个用户自定义文件~/.bash_login并发送它。如果~/.bash_login也不存在,则发送~/.profile(如果该文件存在的话)。只有~/.bash_profile,~/.bash_login和~/.profile三个文件中的一个会被发送。Bash会一直检查看是否用户有一个./bashrc文件,一旦发现即发送之。
(sample .bash_profile)
# .bash_profile
# the file is sourced by bash only when the user logs on.
# get the aliases and functions
1 if [ -f ~/.bashrc ]; then
2 . ~/.bashrc
fi
# User specific environment and startup programs
3 PATH=$PATH:$HOME/bin
4 ENV=$HOME/.bashrc # or BASH_ENV=$HOME/.bashrc
5 USERNAME="root"
6 export USERNAME ENV PATH
7 mesg n
8 if [ $TERM = linux ]
the
startx #start the x windows system
fi
说明
1, 如果用户的根目录有一个文件.bashrc的文件….
2, 登陆shell时执行文件.bashrc。
3, 用户的bin目录被追加到PATH变量,该目录通常时存储shell脚本的。
4, BASH_ENV(ENV)文件被赋予文件.bashrc的路径名,而只有当BASH_ENV(ENV)变量被设定之后,shell才会为交互的bash shell和脚本提供一个初始文件。.bashrc文件保护用户自定义的各种别名和函数。
5, 变量USERNAME赋值为root
6, 变量被导出,以备子shell和其他进程需要之用。
7, 执行带n参数的mesg命令,禁止其他用户从终端写入。
8, 假如变量TERM的值为“linux”,startx将会启动x窗口系统(该图形用户界面允许许多用户虚拟控制),而不启动Linux的交互对话控制平台。因为~/.bash_profile只是在用户登陆的时候才发送,所以登陆shell(login shell)正是启动x窗口对话最好的环境。
BASH_ENV(ENV)变量。在bash2.0版本推出之前,BASH_ENV文件仅备称为ENV文件(korn shell里也是如此)。BASH_ENV(ENV)变量在~/.bash_profile里设定。若赋给它一个文件的名字,则在其后每次启动bash shell或bash脚本的时候都会执行该文件。BASH_ENV(ENV)文件里保护着特点的bash变量和别名。常规文件名是.bashrc
.bashrc文件。BASH_ENV(ENV)变量给赋予(常规)名字.bashrc.那么,当每次启动一个新的或者交互的bash shell或者bash 脚本的时候,该文件就会自动执行,而且其设置都是bash shell独有的。
(sample .bashrc)
#if the .bashrc file exists,it is in the user's home directory.
#it contains aliases (nicknames for commands) and user-defined
#functions
# .bashrc
# User specific aliases and functions
1 set -o vi
2 set -o noclobber
3 set -o ignoreeof
4 alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
5 stty erase ^h
# Source global definitions
6 if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
7 case "$-" in
8 *i*) echo This is an interactive bash shell
;;
9 *) echo This shell is noninteractive
;;
esac
10 history_control=ignoredups
11 function cd { builtin cd $1; echo $PWD)
说明
1, 带-O选项的set命令打开/关闭特定的内置命令(见”设定 –o 选项”).假如开关为-o,再加上一个减号,选项就打开。即如后面跟的是一个加号,选项就关闭。
2, 将noclobber选项打开能防止用户在重新定向时覆盖文件。
3, 通常情况下,你可以通过键入ctrl-D来退出shell。而设置了ignoreeof选项后必须键入exit。
4, 把rm –i 的别名设置为rm,可让rm 工作在交互模式下,即,在真正删除文件前提示用户是否确认。把cp –i别名设置为cp,可让cp工作在交互模式下。
5, stty命令用于将终端的退格键设置为擦除符。^h代表退格键。
6, 若存在名为/etc/bashrc的文件,则执行它。
7, 如果shell是交互式的,则特殊变量$-应包含字符串“i”,否则,你可能正在运行一个脚本。Case命令用于计算$-。
8, 如果$-的值与*i*匹配,即任何含”i”的字符串,则shell显示” This is an interactive bash shell”
9, 否则,shell显示“This is noninteractive”.
10, History_control设置用于控制如何在历史文件中存储命令。忽略副本。
11, 这是个用户自定义的函数,当用户切换目录时,显示当前工作目录PWD。该函数被命名为cd且该函数的定义还包括了cd 命令。在函数的定义中,特殊的内部builtin被添加在cd命令前,以防止函数陷入无限递归,即,无限的自我调用。
/etc/bashrc文件。系统范围的函数和别名在/etc/bashrc文件中进行设置。主提示符通常在该文件中设置。
(sample /etc/bashrc)
# system wide functions and aliases
# Environment stuff goes in /etc/profile
# For some unkown reason bash refuses to inherit
# PS1 in some circumstances that I can't figure out.
# putting PS1 here ensures that it gets loaded every time.
1 PS1="[u@h W$"
2 alias which="type -path"
说明
1, 这里设置系统函数和别名,bash的主提示符被设置为用户名(u),@符号,主机名(h),当前目录名和一个美元符号。这个提示符将出现在所以交互shell中。
2, 命令的别名和昵称通常在用户的.bashrc文件中设置。别名是预先设置的并在bash启动以后可以使用。可以使用它寻找文件在磁盘上的存储位置,即文件所在的目录。例如which ls 命令的结果是/bin/ls