本节书摘来自异步社区《UNIX编程环境》一书中的第1章,第1.1节,作者:【美】Brian W. Kernighan , Rob Pike著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章 初学UNIX
第1章初学UNIX 什么是UNIX?狭义地看,它是一个分时操作系统内核,即一个控制计算机的资源并将其分配给用户的程序。它让用户运行其程序,并控制与机器连接的外围设备(硬盘、终端、打印机等),提供一个文件系统用以管理诸如程序、数据及文档等长期存储的信息。
广义地看,UNIX通常不仅包含内核,还包括一些基本程序,如编译器、编辑器、命令语言、用以复制和显示文件的程序等。
从更广的角度来看,UNIX可以包括由用户开发的、运行于用户的UNIX操作系统上的程序,如文档处理工具、统计分析程序以及图像软件包等。
这些有关UNIX的解释究竟正确与否,取决于读者所面对的系统的应用级别。本书其他部分提到UNIX时,会在上下文指示其内在含义。
UNIX系统有时看起来比实际上更复杂—对于新用户而言,很难充分利用可用的资源。所幸它并不难入门—只要了解很少的几个程序,就可以开始工作了。本章会帮助读者尽快地学会使用UNIX系统。本章是概述,不是手册;后续的章节将详细介绍各种内容。本章涉及以下主要内容。
基本操作—登录和退出、简单的命令、纠正输入错误、邮件及终端间通信。
日常使用—文件及文件系统、文件显示、目录以及常用命令。
命令解释器或shell—文件名缩写、输入输出重定向、管道、删字符及消行符设置、命令查询路径定义。
如果你用过UNIX,那么对本章的多数内容应该是熟悉的,可以直接跳至第2章。
即使阅读本章,也需要一份《UNIX程序员手册》。对作者而言,告诉你翻阅手册中的某些内容,比在书中重复这些内容更为方便。本书不是为了替代手册,而是为了教会你充分利用手册中的命令。另外,本书中所叙述的内容可能同你的系统上的内容有所差别。在手册中的开始处有索引,可以协助找出解决某一问题的程序,应学会如何使用它。
最后,有一句忠告:不要害怕实践。如果你是初学者,请放心,不会出现伤害自身或其他用户的事。实践出真知。本章篇幅较长,最好的方法是一次读几页,并在学习过程中不断实践。
1.1 起步
1.1.1 有关终端和输入的一些预备知识
为了避免繁冗解释有关计算机使用的所有事项,作者假定你已经熟悉计算机终端,并知道使用方法。如果下面的叙述使你迷惑不解,请询问身边的专家们。
UNIX系统是全双工的:你在键盘上敲入的字符送至系统,然后系统回送给终端并在屏幕上显示出来。通常echo进程把字符直接复制到屏幕上,这样就可以看到输入的是什么。但是有的时侯,比如在键入密码时,echo关闭,字符就不会在屏幕上显示出来。
多数键盘字符是普通字符,没有什么特殊的含义。但有些字符是通知计算机怎样解释所键入的内容的。到目前为止,这些键中最重要的键是回车键(RETURN)。回车键说明一行输入的结束,系统做出反应把屏幕上的光标移到下一行的起始处。必须按下回车键后,系统才会对键入的字符做出解释。
回车键是一种控制字符,即不可见的字符,它控制着终端上某些特殊的输入输出。在任一台终端上,回车键都有自己的按键,但是其他大多数控制字符并非如此。相反,它们必须通过按住Ctrl键(有时称为CONTROL键、CNTL键或CTL键)的同时按下另一个键(通常是一个字母)来输入。例如,回车键可以通过按下回车键输入,或者按住CONTROL键同时按下m键。所以回车键又可称为CONTROL+m键,也可以写成Ctrl + m。其他的控制字符有:Ctrl + d,表示程序输入到此结束;Ctrl + g,终端上的振铃鸣响;Ctrl + h,通常称为(退格键)Backspace,它可以用于纠正错误的输入;还有Ctrl + i,通常称为Tab,它使光标往前跳一个Tab间隔,这一点非常类似于普通的打字机。在UNIX系统中,Tab间隔为8个空格字符。在多数终端上Backspace和Tab都有各自的键。
另外两个键也具有特殊的含义:一个是Delete,有时又称为Rubout或某些其他缩写;另一个是Break,有时又称为Interrupt。在多数UNIX系统中,按Delete键可以立即中止程序,而不等待程序完成。在某些系统中,Ctrl + c提供这项功能。而在有些系统中,根据终端的连接方式,Break与Delete或Ctrl + c的功能一样。
1.1.2 与UNIX会话
让我们从与UNIX系统的会话开始。在本书的例子中,你键入的内容用等宽斜体字符表示,计算机回应的内容用等宽正体字符表示,说明性的文字用楷体表示。
建立连接:必要时拨号或打开电源。
系统应该显示:
上述内容就是一段会话的全部,当然,有时人们也做一些其他的工作。本节的下面部分将讨论这段会话,顺便分析一些其他有用的程序段。
1.1.3 登录
登录必须有登录名和口令,这些可以从系统管理员处得到。UNIX系统可以适用于多种类型的终端,但它更倾向于有小写字体的设备,因为UNIX区分大小写!如果你的终端只有大写字符(类似某些可视终端和便携式终端),那么使用起来会很困难,应该另外换一台终端。
要确认设备的开关设置为大小写、全双工,以及身边专家们建议的其他设置,诸如传输速率,即波特率。要为终端建立连接,这也许要拨通电话,或者只是拨一下开关。不论哪种情形,系统都会出现:
如果出现乱码,则可能是速率不对,请检查速率和其他设置。如果仍不成功,按几次Break键或Interrupt键。如果仍不出现登录消息,那就只好请人帮忙了。
出现login:登录提示后,用小写字母键入登录名,然后按回车键。如果要求密码,系统会有提示,而且屏幕不会显示所输入的密码。
登录一旦成功,系统便会显示一个提示符,通常是一个字符,表示系统已经准备好接收用户的命令。提示符多半是美元符号($)或百分比符号(%),但是你可以将其改为任意的符号,这一点以后再讨论。提示符实际是由一个名为命令解释器或称为shell的程序显示出来的,它是系统对用户的主界面。
在提示符之前可能会有日期消息,或者有关于电子邮件的通知。有时系统会询问你正在使用的终端类型,这有助于系统利用终端所具有的特性。
1.1.4 键入命令
一旦有了提示符,就可以键入命令了,命令就是请系统完成某项工作的要求。我们使用“程序”这一词作为命令的代名词。当看到提示符(假设是$)时,键入date并按下回车键。系统应该回应日期和时间,然后显示下一个提示符,所以整个处理过程在终端上看起来如下所示:
不要忘了回车键,也不要键入$。如果系统没有反应,可以按回车键,应该会有响应。以后不再按回车键,但是在每一行的结尾都需要它。
下一个要尝试的命令是who,它表明当前有哪些人在登录上机:
首列是用户名。第二列是连接的终端的名称(tty即teletype,终端的一个学名)。其余信息是登录的日期和时间。读者还可试验:
如果键入出错,输入了一条不存在的命令,会被告知没有发现该命令:
当然,如果你不恰当地键入了一条实际存在的命令,它会运行,也许会出现奇怪的结果。
1.1.5 异常的终端行为
有时终端会出现一些奇怪的行为,例如,一个字符也许会显示两次,或者回车键可能不把光标置到下一行的首列。通常可以把终端关闭再开启,或者退出登录然后再次登录以消除这些现象。也可以阅读手册第1节中有关stty(set terminal options)命令的叙述。如果终端没有Tab键,要想巧妙地处理该键,可键入命令
接着系统会把tabs转换成正确数量的空格。如果终端的Tab间隔可以设置,命令tabs会正确地为用户设置跳格位置。这时,需要键入
这样即可使系统正确工作—请参阅手册中有关tabs命令的说明。
1.1.6 键入错误
如果出现键入错误,并且在按回车键前发现了它,可有两个方法纠正:一次删去一个字符或者删行后重新键入。
如果键入消行符,其默认值是@,会取消整行,就好像没有键入该行一样,从而可以开始新的一行:
字符#删除所键入的最末一个字符,每个#字符删去一个字符,一直到行的起始处(但不会超越它)。如果键入出错太多,可以进行如下纠正:
专用删字符和消行符是与系统密切相关的。在很多系统中(包括作者使用的系统),删字符都已改为Backspace键,这在可视终端上很成功。你可以键入如下内容迅速检查所使用的系统是哪一种情况。
(我们把Backspace键印刷为←,这样就可以看到它。)消行符的另一种常见形式是Ctrl + u。
在本节的其余部分,将使用字符#作为删字符,因为它较为清晰可见,如果系统不一致,请做好思想准备。在1.4.5节将介绍如何设置你所喜欢的删字符和消行符。
假如必须把删字符或者消行符作为文本的一部分输入,该怎么办呢?在#或@之前加入反斜杠(),它们就失去了特有的含义。所以要输入#或@,只需键入#或@。系统会先把终端光标移在@之后的下一行,即使它前面有反斜杠。不过不用担心,该@符号已被记录下来了。
反斜杠有时被称为转义字符,它主要用于指明后续字符是特殊字符。要消除反斜杠,需要键入两个删除字符,即##。知道这是为什么吗?
键入的字符在到达最终目的地之前,要经过一系列程序的检查和解释,至于如何解释它们,则完全取决于它们如何结束以及如何到达终点。键入的每一字符立即在终端显示,除非回应功能被关闭(而这是极少见的)。在按回车键之前,字符还未被内核保留,所以键入的错误可以用删字符或消行符纠正。当删字符或消行符前端有反斜杠时,内核会去掉反斜杠,并且不加解释地保留后续字符。
按下回车键之后,保留的字符被送到从终端读取字符的程序。程序也许会以特殊的方式解释字符,例如,假若字符的前面有反斜杠,shell就关闭特定的字符解释器。这在第3章会进一步探讨。总之应该认识到,内核处理删字符或消行符,而反斜杠只有在删字符或消行符之前,才会被内核处理;其他剩下的字符都可以被别的程序解释。
练习1-1 说明下面命令的结果:
练习1-2 多数shell(尽管第7版shell并非如此)把#解释为注释,并忽略从#开始至行尾的全部文字。按照这一点,说明下列的文本,假设删字符也是#。
1.1.7 继续键入
在键入的同时,内核读取所键入的内容,即使系统在忙于其他事务时也是如此,所以你可以用最快的速度键入想输入的内容,即使有命令正在显示也没有关系。如果此时系统正在输出,则输入字符会同输出字符混合在一起,但它们会另行存储并以正确的次序解释。你可以一条接一条地输入命令,而无需等待它们完成,甚至不需要等待它们 开始。
1.1.8 中止程序
通过按Delete键,可以中止大多数命令。在某些终端上,Break键也起作用。当然这是与系统相关的。在少数程序中,如文本编辑器,Delete键中止了程序的执行过程但仍停留在该程序中。关闭终端或挂断电话会中止大多数的程序。
如果只打算暂停输出,如在要避免某些关键信息从屏幕上消失时,可以键入Ctrl + s,输出会立即停下来,程序会被挂起直到再次启动。要继续输出,可键入Ctrl + q。
1.1.9 注销
注销的正确方法是按下Ctrl + d,而不用输入命令。这样就通知shell,输入中止了(至于它到底是如何起作用,下一章再作说明)。实际上,可关闭终端或挂断电话来注销,但这样做是否真正注销了,取决于不同的系统。
1.1.10 邮件
系统提供一套邮件系统用于与其他用户通信,所以有时在登录时,在第一个提示符之前会看到下列消息:
要阅读邮件,请键入
邮件消息会显示出来,一次一条消息,最新的消息首先出现。在每一项消息后面,邮件等待用户的行动指示。一般有两种基本响应方式:d,删除该条消息;回车键,不删除该条消息(消息会保留,下次可以阅读消息)。其他处理包括:p,显示消息;_s_filename(文件名),以你起的名称保存消息;q,从mail中退出。(假如不知道文件这个概念,简单地把它看成一个用选定的名字保存信息的地方,以备今后再使用。文件是1.2节的主题,而且本书很多部分都在讨论它。)
同已经介绍的程序相比,mail有各种不同的版本。请阅读手册以了解细节。
给他人发邮件很简单。假设要给登录名为nico的人发邮件。最方便的方法是这样的:
在此键入邮件文本,可键入任意长度的文本,输入完毕后按
Ctrl + d指明信件的结尾,通知mail没有输入了。如果在编辑信件过程中改变了主意,可以按Delete键,而不须使用Ctrl + d。写到一半的信件将存放在名为dead.letter的文件中而不是邮出。
作为练习,给自己发封邮件,然后键入mail读取它(它不像听起来那么奇怪—这是一个简便的提醒机制)。
发邮件还有其他一些方法—发出一封事先准备好的信件,或一次给许多人同时发信,也可以发信给使用其他机器的人们。有关细节请参阅《UNIX程序员手册》第1节中的有关mail的叙述。今后我们将用标记mail(1)来表示手册中第一节中有关mail的叙述。本章讨论的所有命令都可以在第1节中找到。
系统还有日历服务(参见calendar(1)),如果你没有使用过,我们会在第4章介绍如何设置它。
1.1.11 用户间通信
如果你的UNIX系统是多用户的,某一天,屏幕上可能会出现类似如下的语句:
并伴随着一声蜂鸣声。Mary打算写信给你,但是除非采取明确的行动,否则不能写回信。若要回应,请键入
这样,就建立了一条双向通信途径。现在Mary在她的终端上键入的内容,会出现在你的终端上;反之也一样,尽管通信很慢,但毕竟不像是同月球通话。
如果你正在进行某项工作,那么必须进入可以键入命令的状态。通常,正在运行的程序必须中止,但是有些程序,诸如编辑器以及write命令本身,利用“!”命令可暂时切换到shell,请参阅附录A中的表A-2。
write命令没有规则,所以要有一个协议,以免你键入的内容同Mary键入的内容混到一起。通常的做法是,每一方以(o)结束,它表明“完毕”,打算退出的信号是(oo),其含义是“完毕并退出”。
要退出write也可以按下Delete键。注意,键入的错误不会在Mary的终端上出现。
如果要写信给某个未登录的人,或者收件人不想被打扰,系统会通知你。如果目标登录了,但是在一个间隔后没有回答,也许对方太忙或者不在终端旁,只要按Ctrl + d或Delete键就可以退出。如果你不想被打扰,可利用mesg(1)。
1.1.12 新闻
许多UNIX系统提供了一种新的服务,可使用户随时了解一些有趣无趣的事件。试试键入
UNIX系统通过电话拨号连接,形成了一个很大的网络,有关netnews和USENET,请询问身边的专家。
1.1.13 手册
《UNIX程序员手册》描述了大量读者需要了解的关于系统的信息。第1节介绍命令,包括本章讨论的内容。第2节讨论系统调用,这是本书第7章的主题,而第6节是关于游戏的内容。其余章节讨论C程序员使用的函数、文件格式,以及系统维护(这些章节的编号随着系统的不同而变化)。在开始使用手册时,不要忘记使用各种形式的手册索引。可以通过快速地翻阅手册索引,了解相关命令的内容。还有关于UNIX系统运行原理的介绍。
通常手册以在线形式存放,这样可以在终端上阅读。如果你不知道做法,又找不到专家协助,可以在终端上用命令man显示有关页面。下面例子是读取who命令的说明:
而下面例子则说明了man命令。
1.1.14 计算机辅助教学
你的系统中也许有learn命令,这个命令提供了有关文件系统、基本命令、编辑器、文档准备,甚至包括C语言程序设计的计算机辅助教学。请试一下:
它会告诉你从哪儿开始,可以做什么。如果不行,可以再试一下teach。
1.1.15 游戏
游戏往往不被正式承认,但熟悉计算机和终端的最好方式之一,就是玩游戏。UNIX系统提供了适量的游戏,通常在本地机上就有。问问周围的人,或者查看手册的第6节。