2006年11月24日星期五

1.5. 交互使用Shell

1.5. 交互使用Shell

使用shell的交互功能,就是从登陆开始一直到你注销为止(以输入exit或者输入CTRL-D[5])。在登陆后,你在shell命令行中输入;这些行是以你在终端或工作环境下输入的文本且以回车为结尾的一行。

[5] shell可以被配置为对CTRL-D退出信号无相应。我们推崇这样做,因为CTRL-D 太容易意外触动。查看Chapter 3 中关于此的详细信息。

默认情况下,shell提示符为每个命令提供已美元符号结尾的信息字符,但是你可以通过查看Chapter 3修改所有提示符内容。

1.5.1. 命令、参数和选项

shell命令行由一个或多个单词组成,每个单词由空格或TABs(制表符)区分。每一行的第一单词是命令。其他的(若是有的话)是命令的参数(也叫变量),就是在指明某个命令上如何运行的名称。

举例来说:命令lp myfile由命令lp(打印一个文件)和一个参数myfile组成。lp指定myfile为打印文件的名字。参数一般多为文件名,但是不一定是:在命令mail cam,mail程序则以cam为要发送到的用户名。

选项是特殊类型的参数用于给命令传递所需运行的特殊信息。选项通常是跟随的简单字母;我们说“通常”是因为它遵守手动快捷的规则。命令lp –h myfile 包含选项-h,它告诉lp不要在打印文件前打印“标题页”(banner page)

有时选项是他们自己的参数。譬如lp –d lp1 –h myfile 有两个选项和一个参数。第一个选项是-d lp1,意思是“发送输入到打印机(目的地)教lp1。”第二个选项是和参数是同前一个例子相同的。


1.4. 获得 bash

1.4. 获得 bash

你也许现在已经使用了或未使用bash。你的系统管理员也许聪明的认为不论怎么样他在系统中使用的是“标准”的。你也许甚至不知道还有一个可以使用的shell。

当然知道你现在正在使用的shell很简单。登陆到你的系统在提示符中输入echo $SHELL。你会看见回应中包含sh、csh、ksh或bash分别表示Bourne, C, Korn, 和 bash shell。(There's also a chance that you're using another shell such as tcsh.)

若是你还未使用bash且又想使用它,首先你需要查找是否它最简在你的系统中。只需要输入bash。若是你得到一个由一些信息加上美元符号新提示符(譬如:bash3 $),那么一切都正常,输入exit可以返回你平时的shell。

若是你得到一个“not found”信息,那么你得系统没有安装它。告诉你的系统管理员或者其他懂得的用户,从而获得非正规途径机会在系统中安装某个版本的bash。若是不行,参阅Chapter 11去找到怎样获得某个版本的bash。

当你确定你的系统有bash时,你可以在其他shell中像前面介绍一样输入bash来调用它。However, it's much better to install it as your login shell, i.e., the shell that you get automatically whenever you log in.你可以自行安装。这有为各个UNIX系统所写的使用手册。若是一些功能不能工作(譬如:你输入命令后返回“not found”错误信息或一个空行的相应),你需要停下来拜访你的系统管理员。或者切换到Chapter 12 ,这里我们列出了些简单的方法去切换你的当前shell。

你需要找到bash在你系统的什么地方,如:在哪个目录安装它。你可以通过输入whereis bash(特别是你在使用 C shell )找到它的路径;若是他不工作,试试whence bash,which bash或这个复杂的命令:[3]

[3] 确保你使用正确的引号在以下的命令:’而不是`。

grep bash /etc/passwd | awk -F: '{print $7}' | sort -u


你会看见回应中包含/bin/bash或/usr/local/bin/bash。

将bash设置为登陆shell,输入chsh bash-name,bash-name就是你用whereis(或类似的命令)返回的值。譬如:

% chsh /usr/local/bin/bash


你会得到一个错误消息说shell错误,或要求输入密码。输入你的密码,然后注销后再次登陆就可以开始使用bash。

[4] 考虑到系统安全,只有特定的程序员被容许安装登陆shell。

1.3.History of UNIX Shells

1.3. History of UNIX Shells

在UNIX的历史上,相对于操作系统独立的shell本身也发展出来很多shell,但是只有很少的几个被普遍应用。

第一个卓越的shell是Bourne shell(以其发明人命名:Steven Bourne),它从1979年开始包含于第一个主流UNIX发行版的版本7中。Steven Bourne最出名的是系统中的sh。尽管UNIX从头到尾有了很多很多的变化,但是Steven Bourne依然流行并且本质也未有多少改变。很多UNIX的工具和管理功能都依赖于此。

第一个广泛使用的shell是C shell(或csh)。它是Bill Joy为加州大学柏克利分校软件(BSD)的UNIX 7版本后所写的。

从C shell的名称便可知他的命令操作类似于C语言,是程序员更容易入手学习UNIX系统。它支持很多操作系统特性(譬如:job control; see Chapter 8)且专为BSD UNIX设计,但是它被移植现在的各种UNIX版本中。它也有很多重要的特征(e.g., aliases; see Chapter 3)使其更贴切与普通用户的使用。

最近几年很多其他的shell开始流行。最著名的是Korn shell。它在商业发行版中结合了Bourne和C shell中最好特点,并加上其他许多它自己的特点。[1] Korn shell与bash有很多的相似,都拥有很多的特性使应用更加方便。Bash的特点是它是免费的。Korn shell的其它相关材料请参考Appendix A.

[1] Korn shell 可以随意下载,但是它附带一个许可证表明在某些地方使用是需要付费的。

1.3.1. Bourne Again Shell

Bourne Again shell(以再次感激Steve Bourne命名)创建于GNU组织。[2] GNU组织是由Free Software Foundation (FSF)(免费软件基金会)的Richard Stallman发起,目的是创建统一的UNIX操作系统平台并且替换所有商业发行版UNIX工具且免费发放它们。GNU不仅仅代表新软件,而且引入新的发行方式:copyleft。Copylefted软件可以免费分发或进一步分发(譬如:源代码必须免费发送)

[2] GNU 首字母缩写, GNU's 不是 UNIX。

Bash,正式“出生”在1988-1-10一个星期日并预定为GNU组织的标准shell,Brian Fox写出了第一个bash版本而且一直改进维护它直到1993年。早在1989年Chet Ramey加入并负责修改众多缺陷和很多宜用特征。Chet Ramey是现在bash官方的维护者和拓展者。

为了遵守GNU法则,所有从0.99版本的bash都可以从FSF免费获得。bash进入了所有主流UNIX且迅速成为众多Bourne shell派生版中最流行的一个。它也成为Linux(一个广泛使用的免费UNIX操作系统)中的标准shell,甚至是Apple的 Mac OS X也有它的存在。

在1995年Chet Ramey开始从事发布新版本2.0(于1996年12月23日发布),bash 2.0相对于前一版本(前一版本1.14.7)添加一系列的新特征使其更好的兼容不同的标准。bash 3.0更加强了一些新特征和对标准的支持。

此书描述bash 3.0。它适用于所有前面发布的bash版本。现在版本中的一些特征若是在前些版本不同或是缺少都会在文本中注明。

1.3.2. bash特征

虽然Bourne shell依然被人认为是“标准”shell,bash却日益的变得流行起来。除了它继承了Bourne shell的兼容性外,他还包容了很多C shell 和 Korn shell的优秀特点。

bash命令输入行的可编辑模式是最吸引用户的地方。在命令行里可以编辑使人更容易的返回修改和更改前一个命令,比C shell历史纪录机制更好,而Bourne shell却不能使你做所有这一切。

另外主流的bash特征是提供用户进程管理的功能(job control)。在Chapter 8中会解释,进程管理如何提供你在同一时间关闭、运行和暂停任意一个命令。这个特征几乎完全借鉴与C shell。

Bash最为重要的优势主要在于体现在它的自定制者和编程者上。他拥有很多选项和变量去定制,且它在开发特征方面也值得注目的提供了function(函数)定义,更多的控制特性,整数算法和高级的I/O控制,等等。

1.2. Scope of This Book

1.2. Scope of This Book

在此书里你讲学习关于bash的知识,这是一个最新且强大的主流UNIX shells。有两种方法使用bash:用户接口或是编程环境。

这章和下一章将覆盖用户接口。这两章将教会你足够的知识去沉着完成你每天的工作。

使用shell以后,你会自然而然的发现一些您的环境特征(shell视觉和功能)需要改变,及如何自动的执行改变。Chapter 3 告诉你几个方法来完成。

Chapter 3 还为你学习shell编程提供准备,大部分覆盖从Chapter 4 到 Chapter 6的内容。你务须有编程经验去理解这些章节和学习shell编程。Chapter 7 和 Chapter 8 提供关于I/O和进程处理更加完善细致的描述,Chapter 9 则描述如何使用不同的技术调试shell程序。

你会在此书中学到很多关于bash的内容,也会学到UNIX的功能以及一般情况下UNIX操作系统如何工作。没有任何的编程经验也是可以成为一个shell编程高手。同时,我们小心的避免过多叙述UNIX内层架构。我们主张不必精通UNIX内层架构之后才使用shell和对其编程,并且我们也不准备为低级的系统程序员细说shell特性。

1.1.什么是Shell?

1.1.什么是Shell?

Shell的任务就是将用户的命令翻译为操作系统的操作规程,举例来说:

sort -n phonelist > phonelist.sorted


意思为:“将phonelist文件中的电话号码排列好,并且写入到文件phonelist.sorted文件中”。以下为此Shell在此命令中所作的:

  1. 分解一行为各个组件sort, -n, phonelist, >, and phonelist.sorted。这些组件称为单词。

  2. 确定这些单词的目的:sort是命令,-n和phonelist是参数,>和phonelist.sorted和在一起为I/O instructions(输入输出规程)

  3. 根据> phonelist.sorted(输出到文件phonelist.sortedi)和一些标准,固有的方式设置I/O。

  4. 找到命令sort并且加入选项-n(排序指令)和参数phonelist(输入文件名)运行

当然,每一步包括一些子操作,每个子操作又包含一些操作系统的细节操作

记住shell本身不是UNIX只是用户与其的接口。UNIX是系统与用户接口不相依赖的第一个操作系统。


i作者原文为output to the file phone list.sorted疑为笔误