Shell设置文件读取流程
/etc/shells记录了Linux系统中支持的所有shell,默认使用bash。用户登入Linux系统时会获取到一个shell,具体获取到哪个shell与登录账号有关,/etc/passwd中每个账号信息中最后一个信息记录的就是该账号登入系统会获取到的shell。
获取到shell之后,shell会在启动时读取一些设置文件。具体读取了哪些设置文件又要分login shell和non-login shell(顾名思义,就是需要登录的shell和不需要登录的shell)两种情况。
login shell会读取/etc/profile和~/.bash_profile或~/.bash_login或~/.profile这两个文件,前者为系统全局设置,后者为当前用户个人设置。具体流程图如下(图借自鸟哥,为centos7设置文件读取流程):
/etc/profile做的事情:
1. 定义一些环境变量:
PATH、MAIL、USER、HOSTNAME、HISTSIZE、umask,等等。
2. 读取其他设置文件:
(1)/etc/profile.d/*.sh:规范了bash操作界面的颜色、语系、ll与ls指令的命令别名、vi的命令别名、which的命令别名,等等。
(2)/etc/locale.conf:由/etc/profile.d/lang.sh读入,设置bash默认使用的语系。(centos7以前版本为/etc/sysconfig/i18n)
(3)/usr/share/bash-completion/completions/*:由/etc/profile.d/bash_completion.sh读入,设置了命令补齐、文件名补齐等功能。
bash读取全局设置文件/etc/profile之后会读取当前登录用户的个人设置文件,按顺序读取~/.bash_profile、~/.bash_login、~/.profile的其中一个。
~/.bash_profile做的事情:
1. 读取~/.bashrc:这个文件定义了一些命令别名,读入了/etc/bashrc(这个文件定义了PS1、umask,读入/etc/profile.d/*.sh)。
2. 将~/bin这个目录加入到PATH中。
non-login shell的设置文件读取流程只是login shell的一部分,从读入~/.bashrc开始。
———————————————————————————————————————————————————————————————————————
指令执行历史:history与~/.bash_history
history:查看当前登录用户执行命令的历史记录。
~/.bash_history:记录当前用户执行命令的历史记录。
history -r:从~/.bash_history读取数据到内存供history指令使用。
history -w:将内存数据写入~/.bash_history中。
history -c:将内存中的指令历史记录清除(不会影响~/.bash_history)。
用户登入系统时bash会从~/.bash_history中读取数据到内存供history指令使用,登出系统时则将内存中的数据写入~/.bash_history中。若用户在多个终端登录了同一个账号,则每一次登出系统都会写一下文件,最后登出的终端的内存数据会覆盖其它所有终端写入的数据。
几个相关变量:
HISTFILE:~/.bash_history文件的绝对路径。
HISTSIZE:history指令最多输出的指令数量(在/etc/profile中定义)。
HISTFILESIZE:~/.bash_history文件中记录的最多指令数量。(若HISTSIZE<HISTFILESIZE,则history读取的是~/.bash_history文件中最后HISTSIZE条指令记录。)
HISTTIMEFORMAT:history指令输出默认只有序号和指令名称,定义这个变量可以使其输出指令执行的时间。使用示例如下:
在~/.bashrc文件最后两行配置:
配置之后记得使用source ~/.bashrc使配置立即生效,最后输出结果如下:
————————————————————————————————————————————————————————————————————————
语系设置:locale与/etc/locale.conf
locate:查询Linux系统当前语系设置,查询结果及各个变量说明如下图所示。
语系设置参数的优先级:LC_ALL > LC_* > LANG。其中LANG是所有变量的默认设置,12个LC_*变量中,没有设置值的变量都将使用LANG的值。如果设置了LC_ALL,则所有的LC_*变量都将使用LC_ALL的值,不管自身的值是什么。所以当LC_ALL设置了值之后,所有LC_*变量进行其他值设置都是无效的,除非先将LC_ALL设置为空。
设置这些变量时,设置之后需要执行export指令将其声明为全局变量才能生效,例如:export LC_TIME=”zh_CN.UTF-8”。然而这样设置也只能在本次登录系统期间生效,下次登录就又回到原来的值了,若想永久生效,需要将其配置写入/etc/locale.conf(centos7之前版本为/etc/sysconfig/i18n)文件中,然后重新登录即可生效,若不想重新登录则需要执行source指令重新读取这个文件,然后再执行export指令将设置的变量转为环境变量才能生效。
locale -a:查询当前Linux系统支持的所有语系。
该命令输出的每一种语系都对应/usr/lib/locale目录(centos7之前版本为/usr/share/i18n/locales)下的一个文件,这些文件就是对每一个语系的配置。可以查看其中一个文件例如zh_CN,可以看到里面使用Unicode编码定义了每一个LC_*变量的输出,例如LC_TIME变量中对于星期几的定义如下:
由上到下分别是“星期日”、“星期一”....直到“星期六”的定义。
—————————————————————————————————————————————————————————————————————
别名:alias与unalias
alias:查看当前所有命令别名定义(这些命令别名可能在设置文件中定义,如:~/bashrc,也可以是使用alias指令定义的)。
所以,执行cp就相当于执行cp -i。
alias指令用于定义命令别名,unalias用于取消命令别名,这里定义举一个例子,设置mkdir指令别名为mkd示例如下:
然而,使用alias定义的命令别名只是在本次登录系统过程中有效,若想永久生效则应该写入到设置文件中,例如可以写入~/.bashrc中。
为什么定义了命令别名之后就可以使用别名来执行命令了呢?这跟Linux系统中指令运行的顺序有关,Linux指令运行顺序如下:
1. 以相对/绝对路径运行指令。
2. 由alias找到指令执行。
3. 由bash内建的指令执行。
4. 使用$PATH变量中的路径搜索到第一个指令执行。
使用type指令可以查看某个指令的类型,使用type -a则可以查看某个指令的执行顺序,如type -a ls。
———————————————————————————————————————————————————————————————————————
一些特殊用途设置文件
/etc/issue和/etc/issue.net中的内容会在启动系统之后登录系统之前显示在屏幕上,其中/etc/issue设置的是在本地终端启动系统后展示的信息,而/etc/issue.net则是在远程连接主机时展示的信息。文件中可使用的转义字符及其意义如下(图借自鸟哥):
/etc/issue.net文件想要生效还需要修改ssh配置文件/etc/ssh/sshd_config中的Banner字段,需要将其值改为/etc/issue.net,然后重启ssh服务。
/etc/motd文件写入的则是登录系统之后显示的内容,而且不支持上述转义字符。
~/.bash_logout文件记录了登出bash之后,系统需要执行的动作,可以在这里进行数据备份、情况缓存等动作。
——————————————————————————————————————————————————————————————————————
一些变量相关指令
echo:输出变量的值,例如:echo $PATH.
unset:取消某个变量。
env:查看所有环境变量。
set:查看所有变量(包括环境变量和自定义变量)。’
选项参数:
-u:默认不启用,启用之后,使用未定义变量会显示错误信息。
-v:默认不启用,启用之后,输出信息之前先显示信息的原始内容。
-x:默认不启用,启用之后,执行指令之前会先显示指令内容。
可以使用echo $-查看所有的set设定值。
还有其他参数。。。
export:查看所有环境变量;将自定义变量转成环境变量。
declare:声明变量类型。
选项参数:
-a:声明变量为数组类型。
-i:声明变量为整形。
-x:将变量转为环境变量,功能与export相同。
-r:将变量设置为readonly类型,不可修改,也不能unset。
typeset:功能与declare功能相同。
stty -a:查看所有快捷键与其意义。(stty也可用于设置快捷键,设置方法参考stty -a输出内容)
————————————————————————————————————————————————————————————————————————
一些常用环境变量
-:所有的set设定值。
$:当前shell的PID
?:前一个指令执行的返回值,若为0表示正确执行,否则表示有错误。
HOME:当前用户家目录。
SHELL:当前使用的shell。
MAIL:使用mail指令收信时,系统读取的邮件信箱文件。
RANDOM:随机数。
PATH:执行指令文件的搜索路径。
PS1:命令行提示字符串。