跳转到内容

1. Shell 的历史

Shell 的作用是解释执行用户的命令,用户输入一条命令,Shell 就解释执行一条,这种方式称为交互式(Interactive),Shell 还有一种执行命令的方式称为批处理(Batch),用户事先写一个 Shell 脚本(Script),其中有很多条命令,让 Shell 一次把这些命令执行完,而不必一条一条地敲命令。Shell 脚本和编程语言很相似,也有变量和流程控制语句,但 Shell 脚本是解释执行的,不需要编译,Shell 程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到 Shell 提示符下执行。

由于历史原因,UNIX 系统上有很多种 Shell:

  1. sh (Bourne Shell):由 Steve Bourne 开发,各种 UNIX 系统都配有 sh
  2. csh (C Shell):由 Bill Joy 开发,随 BSD UNIX 发布,它的流程控制语句很像 C 语言,支持很多 Bourne Shell 所不支持的功能:作业控制,命令历史,命令行编辑。
  3. ksh (Korn Shell):由 David Korn 开发,向后兼容 sh 的功能,并且添加了 csh 引入的新功能,是目前很多 UNIX 系统标准配置的 Shell,在这些系统上 /bin/sh 往往是指向 /bin/ksh 的符号链接。
  4. tcsh (TENEX C Shell):是 csh 的增强版本,引入了命令补全等功能,在 FreeBSD、Mac OS X 等系统上替代了 csh
  5. bash (Bourne Again Shell):由 GNU 开发的 Shell,主要目标是与 POSIX 标准保持一致,同时兼顾对 sh 的兼容, bashcshksh 借鉴了很多功能,是各种 Linux 发行版标准配置的 Shell,在 Linux 系统上 /bin/sh 往往是指向 /bin/bash 的符号链接 [1]。虽然如此, bashsh 还是有很多不同的,一方面, bash 扩展了一些命令和参数,另一方面, bash 并不完全和 sh 兼容,有些行为并不一致,所以 bash 需要模拟 sh 的行为:当我们通过 sh 这个程序名启动 bash 时, bash 可以假装自己是 sh ,不认扩展的命令,并且行为与 sh 保持一致。

文件 /etc/shells 给出了系统中所有已知(不一定已安装)的 Shell,除了上面提到的 Shell 之外还有很多变种。

bash
# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen

用户的默认 Shell 设置在 /etc/passwd 文件中,例如下面这行对用户 mia 的设置:

properties
mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

用户 mia 从字符终端登录或者打开图形终端窗口时就会自动执行 /bin/bash 。如果要切换到其它 Shell,可以在命令行输入程序名,例如:

bash
~$ sh(在bash提示符下输入sh命令)
$(出现sh的提示符)
$(按Ctrl-d或者输入exit命令)
~$(回到bash提示符)
~$(再次按Ctrl-d或者输入exit命令会退出登录或者关闭图形终端窗口)

本章只介绍 bashsh 的用法和相关语法,不介绍其它 Shell。所以下文提到 Shell 都是指 bashsh


  1. 最新的发行版有一些变化,例如 Ubuntu 7.10 的 /bin/sh 是指向 /bin/dash 的符号链接,dash 也是一种类似 bash 的 Shell。 ↩︎