如果你给登录程序一个有效的用户名和密码,他就会在/etc/passwd中检查你该用哪个shell?在大部分情况下linux系统中用的是bash。bash的工作就是读你的命令,并执行他们。他同时也是个用户界面,一门解释语言。
作为一个用户界面,他读取你的命令,如果是内部命令就会立即执行(比如cd)。如果是外部命令,他就会寻找他们并执行(比如cp,startx)。他同时也做一些常规操作,比如保存历史命令,补全文件名。
我们已经看到过bash作为翻译语言时的行为。init运行的脚本一般是shell脚本,并且是由bash运行的。用适当的编程语言,加上系统中常用的各种功能的命令,他们的结合将会是十分强大的。如果你知道自己在干什么,打个比方(自鸣得意状),前几天,我需要运行好几个补丁程序来给一个源代码目录打补丁。我可以用下面的命令:
for f in /home/greg/sh-utils-1.16*.patch; do patch -p0 < $f; done;
他会找出目录下所有以sh-utils-1.16开头,以.patch结尾的程序,把他们排队,把变量f设为这个队列。循环运行do到done之间的命令。在这里有11个补丁文件。但是即使有3000个文件,原理还是一样的。
文件/etc/profile控制了bash系统级别的行为。你在这里放的内容会作用到所有在你系统上使用bash的人。他可以把目录加入PATH或者设置你的EMAIL变量等等。
默认的键盘行为有很多值得增强的地方。他实际上是由readline控制的。Readline是一个分开的软件包控制命令行界面。提供历史命令和文件名补完,和一些其他高级编辑功能。他被默认的编译进了bash。readling通过你自己目录下的.inputrc来配置。bash变量INPUTRC可以用来重载这个选项。打个比方在Red Hat 6里面,INPUTRC在/etc/profile中被设成/etc/inputrc。这意味着每个人都能正常使用backspace,delete,home和end。
一旦bash读取了系统范围的配置文件,他就会寻找你个人的配置文件。他会检查你的home目录。寻找.bash_profile .bash_login .profile。运行它第一个找到的。如果你想在不影响其他人的情况下改变你的bash行为。就在这里更改。打个比方,许多应用程序使用环境变量来控制自己的行为。我把EDITOR变量设为vi,这样我就可以在Midnight Commander(一个非常出色的基于文件管理的控制台)中使用vi,而不是使用mc自带的编辑器。
bash的初级内容很容易学,但是不要就此为止:bash有惊人的深度,养成寻找最佳做法的习惯。
阅读shell脚本,找出你不明白的地方。