Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 的兼容,bash csh ksh 借鉴了很多功能,是各种 Linux 发行版标准配置的 Shell,在 Linux 系统上/bin/sh 往往是指向/bin/bash 的符号链接1。虽然如此,bash sh 还是有很多不同的,一方面,bash 扩展了一些命令和参数,另一方面,bash 并不完全和sh 兼容,有些行为并不一致,所以bash 需要模拟sh 的行为:当我们通过sh 这个程序名启动bash 时,bash 可以假装自己是sh ,不认扩展的命令,并且行为与sh 保持一致。

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

# /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 的设置:

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

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

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

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

-rwxr-xr-x 1 root root 79988 2008-03-12 19:22 /bin/dash

lrwxrwxrwx 1 root root 4 2008-07-04 05:58 /bin/sh -> dash


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