3.2 初识 shell 和 bash

操作系统其实就是一组软件,它控制着整个硬件、管理着整个系统,所以这组软件不能被用户随意操作,因为一旦他使用不当就会让整个系统崩溃。但我们又需要让用户使用操作系统,所以就有了在操作系统上面运行的应用程序。用户可以通过应用程序来指挥内核,以让它完成我们所需要的硬件任务。

从上图我们可以看到,应用程序是在最外层的,就如同鸡蛋的外壳一样,所以这个东西也被称为壳程序(shell)。

kernel, 内核 shell, 壳程序

试想一个场景,我们要让计算机播放音乐,此时需要计算机有以下东西:

  1. 硬件设备:即声卡

  2. 内核管理+驱动程序:操作系统的内核需要支持此硬件,还要有与该硬件配套的驱动程序

  3. 应用程序:即我们输入“发出声音”命令的地方

这其实就是一个输出声音所需要的基本步骤。我们必须要输入一个命令之后硬件才能正常工作,硬件之所以能收到我们发出的命令是因为操作系统的内核管理,而我们正是通过 shell 与内核进行沟通的。

其实 shell 的功能只是给用户提供一个可以操作系统的界面,所以 shell 是需要有能力调用其它软件的,比如 ls, chmod, vim 等命令,它们都是独立的应用程序,只是我们可以通过 shell(即命令行模式)来操作这些应用程序,以让它们通过内核来执行我们想要的任务。

只要是能操作应用程序的软件,都可以称为是 shell。狭义的 shell 是指命令行方面的软件(比如 bash),广义的 shell 则包括图形用户界面模式的软件。

shell 的简单历史

早年的 Unix 发展者众多,所以 shell 依据发展者的不同就有许多版本,比如常听到的 Bourne shell (sh)、在 Sun 里面默认的 C shell、商业上常用的 K shell,还有 TCSH 等,每种 shell 都有其特点。Linux 使用的是 Bourne Again SHell,简称 bash,它是 Bourne shell 的增强版。

第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他就称为 Bourne shell, 简称 sh。后来另一个广为流传的 shell 是由伯克利大学的 Bill Joy 设计的依附于 BSD 版 Unix 系统中的 shell,它的语法有点类似 C 语言,所以才得名为 C shell,简称 csh。

  • 由于 Linux 是由 C 语言编写的,所以很多程序员使用 C 来开发软件,因此 C shell 就相对热门了。

  • 在学术界 Sun 主机势力相当庞大,而 Sun 是主要的 Unix 分支之一,所以 C shell 也是另一个重要且广为流传的 shell。

  • Sun 公司的创始人就是 Bill Joy,而 BSD 最早就是他发展出来的。

目前我们的 Linux 系统至少有下面几个可用的 shells:

  • /bin/sh 已经被 /bin/bash 所替代

  • /bin/bash 即 Linux 默认的 shell

  • /bin/csh 已经被 /bin/tcsh 所替代

  • /bin/tcsh 整合了 C Shell 以提供更多功能

Linux 系统合法的 shell 都会写入文件 /etc/shells 中,之所以这么做,是因为系统的某些服务在运行的过程中会去检查用户能够使用的 shells,而这些 shell 的查询就是借由这个文件来完成的。

比如,在阿里云上查看文件 /etc/shells,会输出如下内容:

# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

bash

bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux 发行版的标准 shell。bash 主要兼容于 sh,是依据一些用户需求而加强的 shell 版本。

在之前的文章中我们提到,当用户顺利地在终端成功登录 Linux 之后,系统会根据 /etc/passwd 文件的设置给我们分配一个 shell,默认就是 bash。

bash 的主要优点:

  • 历史命令:家目录下的 .bash_history 文件

    • 该文件记录的是上次登录以前所执行的命令

    • 本次登录所执行的命令都在内存中缓存着,当我们注销系统之后它们才会被同步到该文件中

  • 命令与文件补全功能,即 tab

  • 命令别名设置功能

  • 任务管理、前台、后台控制

  • 程序化脚本

  • 通配符

组合键
说明

ctrl + u ctrl + k

从光标处向“前”删除命令串 从光标处向“后”删除命令串

ctrl + a ctrl + e

让光标移到整个命令串的最“前”面 让光标移到整个命令串的最“后”面

为了方便 shell 的操作,bash 也内置了很多命令,比如cd, umask。我们可以用 type 命令来查看某个命令是否为 bash 的内置命令,如下:

# type cd
cd is a shell builtin
# type ls
ls is aliased to `ls --color=auto`
# type node
node is /usr/local/bin/node

type 主要找的是执行文件,所以它也可以用来找命令,类似 which

总结

本文简单介绍了下 shell 和 bash,旨在对它们有个感性的认识,培养点心理亲切感。内容包括:

  1. shell 在操作系统层面扮演的角色

    • 鸡蛋壳,shell

    • 给用户提供一个可以操作系统的界面

  2. shell 的简单历史

    • 目前流行的两种 shell:bash 和 tcsh

    • 查看系统支持的 shell:/etc/shells 文件

  3. bash:Linux 的默认 shell

    • bash 的主要优点

    • 查看命令是否是 bash 内置的:type 命令

Last updated