硬件、内核与Shell
相信只要摸过计算机,对于操作系统(Unix,Linux,Windows等)有点概念的朋友大多听过这个名词,因为只要有操作系统那么就离不开 Shell 这个东西。举个例子,当你用计算机播放音乐的时候,你的计算机需要什么东西?
- 硬件:当然就是需要你的应该有声卡这个设备,不然怎么会有声音
- 内核管理:操作系统的内核可以支持这个芯片组,当然还需要提供芯片的驱动程序
- 应用程序:需要用户输入发生声音的指令
这就是一个输出声音所需要的步骤,也就是说,你必须要输入一个命令之后,硬件才会通过你执行的命令来工作。那么硬件如何知道你执行的命令,那就是内核(Kernel)的管理工作了。也就是说,我们必须要通过 Shell 将我们输入的命令与内核沟通,好让内核 可以控制硬件来正确无误地工作
操作系统其实是一组软件,由于这组软件旨在控制整个硬件与管理系统的活动监测,如果这组软件能够被用户随意操作,若用户应用不当,将会使得整个系统崩溃
但是我们总是需要让用户使用操作系统的,所以就有了操作系统上面发展的应用程序。用户可以通过应用程序来指挥内核,让内核完成我们所需要的硬件任务。此时我们可以发现应用程序其实是在最外层,就如同鸡蛋的外壳一样,因此这个东西也就被称呼为 壳程序(shell)
其实壳程序的功能只是提供用户操作系统的一个界面,因此这个壳程序需要可以调用其它软件才好,我们熟悉的很多命令,如 man,chmod,vi
等命令,都是一个个独立的应用程序,但是我们可以通过壳程序( 命令行模式 )来操作这些应用程序,让这些应用程序调用内核来执行所需的任务 [ 接收用户命令,然后调用相应的应用程序 ]
只要能够操作应用系统的软件都能够称为壳程序。狭义的壳程序指的是命令行方面的软件,包括后边要介绍的 bash 等,广义的壳程序则包括图形化用户界面模式的软件,因为图形化用户界面模式也能够操作各种应用程序来调用内核工作。如 Windows Explorer | X Window 就是典型的图形界面 Shell
命令行模式的Shell
刚入门的小伙伴经常会有这样的问题:【 我干嘛要学习 Shell? 不是已经有很多的工具可以提供方便我设置我的主机了吗?不是有 X Window 点一点鼠标就可以搞定了吗? 】
确实,X Window 易用,功能强大,是一个好用的家伙,但是它毕竟是将所有利用到的软件都整合在一起的一组应用程序而已,并非是一个完整的程序,所以某些时候当你升级或是使用其他程序管理模块(如 tarball 而非 rpm)时,就会造成设置的困扰,甚至不同的 Linux发行版所设计的 X Window 界面也都不相同,这样也造成学习方面的困扰
命令行模式的 shell 就不同了,几乎各家 linux发行版使用的 bash 都是一样的。这样一来,我们就可以轻松的转换不同的 Linux发行版,就像武侠小说里面提到的 一法通,万法通
此外,Linux的管理往往需要通过远程联机,而联机时命令行模式的传输速度一定比较快,而且一般不会出现掉线或者信息外流的问题,因此,shell 真的是需要学习的一项工具。它可以让你更深入 Linux,更了解它,而不是只会按一按鼠标而已,所谓 天助自助者 多摸一点命令行模式的东西,会让你对 Linux 更加亲近!
系统中的shell
在了解了 shell 是什么之后,让我们来看看 Linux 使用了哪个 shell?因为早期 UNIX 的发展者很多,所以 shell 根据发展者的不同有很多版本,例如常常听到的 Bourne shell ( sh ),在 Sun 里边默认的 C shell,商业上常用的 K shell,以及 TCSH 等,每一种 shell 都各有其特点。至于 Linux 上使用的这一版被称为 Bourne Again shell ( bash ),它是 Bourne shell 的增强版本,也是基准于 GNU 的架构下发展出来的。
在介绍 shell 的优点之前,先来说一说 shell 的简单历史吧:第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念它所以就被称为 Bourne shell,或直接简称为 sh,而后来另一个广为流传的 shell 是由伯克利大学的 Bill Joy 设计的依附于 BSD 版的 UNIX 系统中的 shell,这个 shell 的语法有点类似 C 语言,所以才得名 C shell,简称为 csh
Bash Shell 的功能
bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux发行版的标准 shell。bash 主要兼容于 sh,并且依据一些用户需求而加强的 shell 版本,bash的优点主要有以下几个:
- 历史命令( history )
bash 的功能里边,相当棒的一个就是它能记录使用过的命令,只要在命令行里按 【 上下键 】就可以找到前后一个输入的命令。在很多的 Linux发行版中,默认的命令记录条目可以达到 1000 个,也就是说,你曾经执行过的命令几乎都被记录下来!
这么多命令记录在呢?就在你家目录内的 .bash_history ,不过需要注意的是,.bash_history 记录的是前一次登录所执行过的命令,至于这一次登录所执行的命令都被缓存在内存中,当你成功的注销系统后,这些命令才会记录到 .bash_history 文件中。
这有什么优点?最大的好处就是可以查询你曾经做过的操作,如此可以知道你的执行步骤,那么就可以追踪你曾经执行过的命令,以作为除错的重要流程。但也有一个烦恼,如果被黑客入侵了,那么它只需要翻你曾经执行过的命令,而你的命令又和系统有关(如直接输入 MySql 的密码在命令行上边),那你的服务器就有危险了!
- 命令与文件补全
经常在 bash 环境中使用 [ Tab ] 是一个很好的习惯,因为它至少可以让你 1)少打很多字 2)确保输入的命令是正确的。使用 [ Tab ] 按键的时机根据接在命令后或参数后而有所不同:
- 接在一串命令的第一个字段后面,则为命令补全
- 接在一串命令的第二个字段后面,则为文件补齐
所以说,如果我想要知道环境中所有以 c 开头的命令,那么按 【c[Tab][Tab]】即可。所以说,有事没事,在 bash shell 下面,多按几次 [ Tab ] 是一个不错的习惯
- 命令别名 alias
假如我需要知道这个目录下的所有文件(包含隐藏文件)及所有的文件属性,那么我就必须要执行 ls-al
命令,有没有更快的替换方式?呵呵,那就是使用命令别名。例如我们直接以 lm 这个自定义命令来替换上边的命令,也就是说,lm 会等于 ls -al
这样的一个功能!
嘿,那要如何做?就直接使用 alias 即可。
-
查看目前环境中的命令别名
alias
-
添加一个命令别名
alias lm='ls -al'
-
删除一个命令别名
unalias 别名
- 任务管理,前台,后台控制( job control,foreground,background )
使用前,后台的控制可以让任务进行得更为顺利,至于任务管理的用户则更广,可以让我们随时将任务丢到后台中执行,而不用担心不小心使用了 ctrl+c 结束了任务。此外,也可以在单一登录的环境中,达到多任务的目的。
- 程序化脚本( shell scripts )
在 DOS 年代还记得将一堆命令写在一起的所谓的批处理文件吧?在 Linux下边的 shell脚本则可以发挥更为强大的功能,可以将你平时管理系统经常需要执行的连续命令写成一个文件,该文件可以通过交互式的方式来进行主机的检测工作,也可以借助由 shell 提供的环境变量及相关命令来进行设计!整个设计下来简直就是一个小型的程序语言了。
- 通配符( Wildcard )
除了完整的字符串之外,bash 还支持许多的通配符来帮助用户查询与命令执行。举例来说,想要知道 /usr/bin 下面有多少以 X 开头的文件吗?使用 【 ls -l /usr/bin/X* 】就可以了,此外还有其它可供使用的通配符,都可以加快我们的操作!