2.5 环境变量配置文件
2.5.1 source命令
先来看看source命令,这个命令会强制执行脚本中的全部命令,而忽略脚本文件的权限。source命令主要用于让重新配置的环境变量配置文件强制生效。命令格式如下:
[root@localhost ~]# source配置文件 或 [root@localhost ~]# . 配置文件
举个例子:
[root@localhost ~]# source ~/.bashrc 或 [root@localhost ~]# . ~/.bashrc
“.”就是source命令,使用哪种方法都是可以的。原来修改了环境变量配置文件,如果要想让其生效,则必须注销或重启系统。现在只要使用source命令就可以省略注销或重启的过程,更加方便。
2.5.2 环境变量配置文件的分类
1.登录时生效的环境变量配置文件
在环境变量配置文件中主要定义了对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等。如果我们修改了这些环境变量,而没有保存到环境变量配置文件中,那么一旦注销或重启系统,这些修改就会丢失。还是那句话:“在Linux中,修改要想永久生效,必须写入相应的配置文件。”当然,我们自己定义的别名虽然不是系统的默认环境变量,但是也是修改操作环境的,如果要想永久生效,则也要放入相应的环境变量配置文件中。
在Linux系统登录时主要生效的环境变量配置文件有以下5个:
· /etc/profile。
· /etc/profile.d/*.sh。
· ~/.bash_profile。
· ~/.bashrc。
· /etc/bashrc。
这5个环境变量配置文件(/etc/profile.d/*.sh是一系列的配置文件)在用户登录过程中会依次生效。不过需要注意,/etc/profile、/etc/profile.d/*.sh和/etc/bashrc这三个环境变量配置文件会对所有的登录用户生效;而~/.bash_profile和~/.bashrc这两个环境变量配置文件只会对当前用户生效(因为每个用户的家目录中都有这两个文件)。这些环境变量配置文件是依靠如图2-4所示的顺序被调用的。
图2-4 环境变量配置文件读取流程
· 在用户登录过程中先调用/etc/profile文件。
在这个环境变量配置文件中会定义如下默认环境变量。
- USER变量:根据登录的用户给这个变量赋值(就是让USER变量的值是当前用户)。
- LOGNAME变量:根据USER变量的值给这个变量赋值。
- MAIL变量:根据登录的用户来定义用户的邮箱为/var/spool/mail/用户名。
- PATH变量:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、/usr/sbin和/usr/local/sbin这三个系统命令目录。
- HOSTNAME变量:根据主机名给这个变量赋值。
- HISTSIZE变量:定义历史命令的保存条数。
- umask:定义umask默认权限。注意:/etc/profile文件中的umask权限是在“有用户登录过程(输入了用户名和密码)”时才会生效的。
- 调用/etc/profile.d/*.sh文件,也就是调用/etc/profile.d/目录下所有以.sh结尾的文件。
· 由/etc/profile文件调用/etc/profile.d/*.sh文件。
这个目录中所有以.sh结尾的文件都会被/etc/profile文件调用,这里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件。对/etc/sysconfig/i18n文件眼熟吗?就是前面讲过的默认语系配置文件。
· 由/etc/profile文件调用~/.bash_profile文件。
~/.bash_profile文件就没有那么复杂了,这个文件主要实现了两个功能:
- 调用了~/.bashrc文件。
- 在PATH变量后面加入了“:$HOME/bin”这个目录。也就是说,如果我们在自己的家目录中建立了bin目录,然后把自己的脚本放入“~/bin”目录中,就可以直接执行脚本,而不用通过目录执行了。
· 由~/.bash_profile文件调用~/.bashrc文件。
在~/.bashrc文件中主要实现了两个功能:
- 定义默认别名。超哥把自己定义的别名也放入了这个文件。
- 调用/etc/bashrc。
· 由~/.bashrc文件调用/etc/bashrc文件。
在/etc/bashrc文件中主要定义了如下内容。
- PS1变量:也就是用户的提示符。如果我们想要永久修改提示符,就要在这个文件中修改。
- umask:定义umask默认权限。这个文件中定义的umask是针对“没有用户登录过程(不需要输入用户名和密码,比如从一个终端切换到另一个终端,或进入子Shell)”时生效的。如果是“有用户登录过程”,则/etc/profile文件中的umask生效。
- PATH变量:会给PATH变量追加值,当然也是在“没有用户登录过程”时才生效的。
- 调用/etc/profile.d/*.sh文件,这也是在“没有用户登录过程”时才调用的。在“有用户登录过程”时,/etc/profile.d/*.sh文件已经被/etc/profile文件调用过了。
这5个环境变量配置文件会被依次调用。如果是我们自己定义的环境变量,则应该放入哪个文件呢?如果你的修改是打算对所有用户生效的,那么可以放入/etc/profile环境变量配置文件;如果你的修改只是给自己使用的,那么可以放入~/.bash_profile或~/.bashrc环境变量配置文件。
但是如果我们误删除了这些环境变量,比如删除了/etc/bashrc或~/.bashrc文件,那么这些文件中的配置就会失效(~/.bashrc文件会调用/etc/bashrc文件),我们的提示符就会变成下面这样:
-bash-4.1#
因为在/etc/bashrc文件中会设定PS1命令提示符,如果这个文件不存在或没有被调用,那么提示符就会是Bash最基本的样子。
2.注销时生效的环境变量配置文件
在用户退出登录时,只会调用一个环境变量配置文件,就是~/.bash_logout。这个文件默认没有写入任何内容,但是如果我们希望在退出登录时执行一些操作,比如清除历史命令、备份某些数据,就可以把命令写入这个文件。
3.其他的环境变量配置文件
还有一些环境变量配置文件,最常见的就是~/bash_history文件,也就是历史命令保存文件。这个文件已经讲过了,在这里我们只是把它归入环境变量配置文件小节而已。
2.5.3 Shell登录信息
1./etc/issue
我们在登录tty1~tty6这6个本地终端时,会有几行的欢迎界面。这些欢迎信息是保存在哪里的?可以修改吗?当然可以修改,这些欢迎信息保存在/etc/issue文件中,我们查看一下这个文件:
[root@localhost ~]# cat /etc/issue CentOS release 6.3 (Final) Kernel \r on an \m
系统在每次登录时,会依赖这个文件的配置显示欢迎界面。在/etc/issue文件中允许使用转义符调用相应信息,其支持的转义符可以通过man agetty命令查询,如表2-13所示。
表2-13 /etc/issue支持的转义符
在本地终端登录时,因为有tty1~tty6这6个本地终端(可以通过Alt+F1~F6快捷键切换),有时我们会忘记在哪个终端中,所以超哥更习惯加入“\l”选项,例如:
[root@localhost ~]# cat /etc/issue
CentOS release 6.3 (Final)
Kernel \r on an \m \l
这样我们在本地登录时,就可以看到到底是在哪个终端中。
2./etc/issue.net
配置/etc/issue文件会在本地终端登录时显示欢迎信息,如果远程登录(如ssh远程登录,或Telnet远程登录)需要显示欢迎信息,则需要配置/etc/issue.net文件。使用这个文件时有两点需要注意:
· 在/etc/issue文件中支持的转义符在/etc/issue.net文件中不能使用。
· ssh远程登录是否显示/etc/issue.net文件中的欢迎信息,是由ssh的配置文件决定的。
如果我们需要ssh远程登录可以查看/etc/issue.net文件中的欢迎信息,那么首先需要修改ssh的配置文件/etc/ssh/sshd_config,加入如下内容:
[root@localhost ~]# cat /etc/ssh/sshd_config …省略部分输出… # no default banner path #Banner none Banner /etc/issue.net …省略部分输出…
这样,在ssh远程登录时,也可以显示欢迎信息,只是不能再识别“\d”和“\l”等信息了。
3./etc/motd
/etc/motd文件中也是有欢迎信息的,这个文件和/etc/issue及/etc/issue.net文件的区别是:/etc/issue及/etc/issue.net文件是在用户登录之前显示欢迎信息的;而/etc/motd文件是在用户输入用户名和密码,正确登录之后显示欢迎信息的。/etc/motd文件中的欢迎信息,不论是本地登录,还是远程登录,都可以显示。
大家需要注意,在国外曾经有黑客入侵服务器,因为服务器上显示的欢迎信息是“welcome…”而免于处罚的案例。所以,我们虽然一直是按照“欢迎信息”进行讲解的,但是这里其实应该写入一些“警告信息”,比如禁止非法用户登录之类的信息。
2.5.4 定义Bash快捷键
记得在Shell中有很多的快捷键吗?我们先来查看一下:
[root@localhost ~]# stty -a #查询所有的快捷键 speed 38400 baud; rows 21; columns 104; line = 0; intr = ^C; quit = ^\; erase = ^? ; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8-hupcl -cstopb cread -clocal -crtscts -cdtrdsr -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
“-a”选项用于查询系统中所有可用的快捷键,可以看到,“Ctrl+C”用于强制中止,“Ctrl+D”用于中止输入。那么,这些快捷键可以更改吗?当然可以,只需执行以下命令即可:
[root@localhost ~]# stty关键字 快捷键 例如: [root@localhost ~]# stty intr ^p #定义Ctrl+P快捷键为强制中止,“^”字符只需手工输入即可 [root@localhost ~]# stty -a speed 38400 baud; rows 21; columns 104; line = 0; intr = ^P; quit = ^\; erase = ^? ; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; #强制中止的快捷键变成了Ctrl+P