第1章 总览

1.1 登录

主要概念

➢ 在Linux系统中,用户会话从“登录(login)”开始。

➢ 用户必须有用户名和密码才能登录。

➢ 如果Linux运行X服务器,用户可以使用图形界面登录。

➢ 用户可以从六个虚拟控制台中的任何一个登录。

➢ 可以使用Ctrl+Alt+F1到Ctrl+Alt+F6的六组组合键在六个虚拟控制台之间切换。

➢ 可以使用Ctrl+Alt+F7切换至默认的X服务器。

➢ 如果系统支持的话,用户可以使用远程Shell通过网络登录。

➢ who命令可列出当前登录的用户及其登录方式。

1.1.1 讲义

1.开始Linux会话

UNIX操作系统的开发始于20世纪70年代早期,那时候还没有个人电脑,多个用户会同时使用运行在一台主机电脑上的UNIX。他们不是每人使用一台个人电脑,而用的是(现在)普遍所谓的“哑终端”——真的只有一个键盘和文本显示器,通过串口与主机相连。为了向UNIX操作系统标识身份,用户首先要提供用户ID(userid)和密码(password)来登录。

虽然Linux(和其他版本的UNIX)现在已经充分利用了个人电脑普及带来的好处,但还是保留了用户、密码、登录和文本终端这些核心概念。本节我们讨论与Linux系统开始交互会话的各种方式。

2.虚拟控制台

红帽企业版Linux在电脑上为用户提供了6个可以使用的“虚拟控制台(virtual console)”。虚拟控制台充当了“哑终端”。使用Ctrl+Alt+F1到Ctrl+Alt+F6的6个组合键访问这6个虚拟控制台,每个控制台对应这6组功能键中的一个。(如果在图形环境中,在虚拟控制台之间尝试切换前,你应该知道使用组合键Ctrl+Alt+F7可以回到图形环境。)

当使用虚拟控制台在Linux机器上开始会话时,屏幕会显示类似以下内容:

        Red Hat Enterprise Linux Server release 5 (Tikanga)
        Kernel 2.6.18-8.el5 on an i686
        station login:

登录时用户输入用户名,不要加空格,然后按Enter(回车)键。接着,用户会被提示输入密码,密码在输入时不会显示在屏幕上,输入后再按Enter键。成功登录后,会出现一个欢迎用户的Shell提示。

        Red Hat Enterprise Linux Server release 5 (Tikanga)
        Kernel 2.6.18-8.el5 on an i686
        station login: elvis
        Password:
        [elvis@station ~]$

本书其他章节会介绍在Shell提示符里可以做什么。现在我们只需学习如何结束会话就可以了:输入“exit”,然后按Enter键。虚拟控制台应该返回到原登录屏幕。

为什么用户会选择使用虚拟控制台而不是图形环境呢?首先,机器可能没有足够的内存或硬件运行图形环境,只有虚拟控制台可以使用。然而,在比较现代的机器上,对于有经验的用户来说,虚拟控制台界面常常迅速且有效得多。虚拟控制台在Linux内核中直接实现,所以在调试系统时它们也很有用,在这种情况下图形环境可能不起作用。最后,对于长年待在机房的网络服务器而言,管理员经常希望避免图形界面给系统管理带来的复杂性。

3.X图形环境

在现代个人电脑上运行时,Linux会使用一个叫做“X服务器(X server)”的底层程序来提供图形环境。作为系统的一个用户,你不是和X服务器直接进行对话,而是它为你运行的所有图形程序提供运行环境。

X服务器通常是作为系统启动序列的一部分而启动的,当它启动时,它会寻找“第一个可用的”虚拟控制台。因为通常有6个虚拟控制台用于文本终端,X服务器一般会使用第七个虚拟控制台。如果你正在使用虚拟控制台,并且知道X服务器在机器上运行,通常可以用组合键Ctrl+Alt+F7切换到X服务器。

如果系统被配置为引导到图形环境,用户会见到登录管理器(Login Manager),如图1-1所示:

图1-1 红帽企业版Linux登录管理器

同样的,用户登录时输入用户名,然后按Enter键,输入密码,再按Enter键。

4.图形环境中的终端

图形环境中的应用程序菜单位于屏幕的左上角,它是通往大量图形应用程序的门户,包括网络浏览器、文本编辑器、图像编辑器、游戏以及更多的图形应用程序。虽然我们鼓励你探究这些应用程序,但是刚开始学习本课程时,我们应该集中精力学习在Linux环境下操作的基本原理,如管理文件和进程。现在对你而言,图形环境中最重要的应用程序是终端。

在红帽企业版Linux中,最常用的终端应用程序是gnome-terminal。要打开一个新的gnome-terminal窗口时,右键单击桌面,选择弹出菜单中的“打开终端”选项,如图1-2所示。

图1-2 打开gnome-terminal

有经验的Linux用户相对于图形应用程序,会偏好命令行界面的灵活性及其强大的功能。这个终端与虚拟控制台相似,提供了Shell命令行界面,如图1-3所示。因为用户已经登录,并启动了图形会话,所以打开新的终端时不需要再次登录。

图1-3 gnome-terminal

使用结束后,输入命令exit(然后按Enter键)关闭gnome-terminal,也可以单击终端右上角的“关闭窗口”按钮。

5.退出图形环境

当用户结束使用图形环境时,可以从“系统”菜单中选择倒数第二项退出,“系统”菜单在“位置”菜单的右边。这会关闭所有打开的窗口,并将图形环境恢复到登录屏幕,等待下一个用户。

图1-4 退出图形环境

6.使用who命令判断谁在系统上

用户可以使用who命令来判断谁在系统上及其登录方式。用户可以从任何终端上输入who命令,然后按Enter键,应该可以看到类似于下面的输出:

        [elvis@station elvis]$ who
        elvis    tty2        May     5 15:07
        root     tty1        May     3 07:50
        blondie  :0          May     5 08:48
        blondie  pts/0       May     5 09:03 (:0.0)

第一列列出了已经登录的用户,最后一列列出了他们登录的时间。如果有点经验的话,就可以从第二列中看出这些用户登录的地点。对前两个用户elvis和root来说,tty1和tty2分别指虚拟控制台1和虚拟控制台2。用户blondie的第二项:0指的是X服务器本身;pts/0指的是在X服务器中打开的第一个终端。不必纠缠于细节之中,我们会看到elvis登录到第二个虚拟控制台;root登录到第一个虚拟控制台;blondie已经登录使用图形环境。

7.通过网络登录一台机器

用户可以用ssh(安全Shell,即secure Shell)工具轻易地登录到远程机器上,无论这台机器在同一个房间还是在地球的另一边。如果远程机器的配置允许远程登录,而且用户在这台机器上有账户,那么登录远程机器与登录虚拟控制台一样容易。在下面的例子中,elvis会在本地机器station.redhat.com的虚拟控制台上登录,然后使用ssh登录到远程机器nimbus.example.com上,这台机器可能在地球的另一边。

注意观察以下示例中的Shell提示。由于Linux用户经常用远程Shell在机器间来回切换,这个提示有助于用户清楚Shell正在运行哪一台机器。

        Red Hat Enterprise Linux Server release 5 (Tikanga)
        Kernel 2.6.18-8.el5 on an i686
        station login: elvis
        Password:
        Last login: Thu Apr  3 13:03:06 from hedwig
        [elvis@station elvis]$ who
        elvis   tty2        May  3 07:48
        [elvis@station elvis]$ ssh elvis@nimbus.example.com
        elvis@nimbus.example.com's password:
        Last login: Thu May  1 17:38:432003 from station.redhat.com
        [elvis@nimbus elvis]$ who
        elvis   pts/1       May  3 11:59 (station.redhat.com)
        [elvis@nimbus elvis]$ exit
        Connection to nimbus.example.com closed.
        [elvis@station elvis]$ exit

注意,当用户elvis在远程机器上运行who命令时,命令会报告elvis登录的机器,即station.redhat.com。

ssh客户端程序也用在Linux以外的操作系统上。例如,开源应用程序PuTTY几乎可以在所有的Windows机器上安装,用于在远程Linux服务器上打开Shell。

1.1.2 示例:使用虚拟控制台

在下面的例子中,用户以elvis作为用户名在第一个虚拟控制台上登录,但却发现系统配置不当。为了修改这个错误的配置,他打算切换到第二个虚拟控制台,以管理员用户(root)的身份登录来解决这个问题。然后退出,切换回第一个控制台,开始工作。

        Red Hat Enterprise Linux Server release 5 (Tikanga)
        Kernel 2.6.18-8.el5 on an i686
        station login: elvis
        Password:
        Last login: Mon May  5 15:07:16 on tty2
        [elvis@station elvis]$ cat /tmp/README
        cat: /tmp/README: Permission denied
        [elvis@station elvis]$ who
        elvis   tty1        May  5 15:54

这时,用户elvis试图读取文件/tmp/README,但其权限不足。由于用户知道这台机器管理员用户root的密码,他可以切换到另一个控制台(使用Ctrl+Alt+F2组合键),以用户root身份登录,修改文件的权限,从而解决这个问题。

        Red Hat Enterprise Linux Server release 5 (Tikanga)
        Kernel 2.6.18-8.el5 on an i686
        station login: root
        Password:
        Last login: Mon May  5 15:54:18 on tty6
        [root@station root]# who
        root    tty2        May  5 15:55
        elvis   tty1        May  5 15:54
        [root@station root]# chmod go+r /tmp/README
        [root@station root]# exit

注意,who命令的输出显示用户以elvis的身份在第一个虚拟控制台登录,然后在第二个虚拟控制台以用户root身份登录。现在用户使用Ctrl+Alt+F1组合键切换到第一个虚拟控制台,继续工作。

        [elvis@station elvis]$ cat /tmp/README
        Kudzu FAQ:
        ----------
        1) So, what is kudzu?
        kudzu is the hardware autodetection & configuration tool, originally
        introduced in Red Hat Linux 6.1. It detects changes in the system's
        hardware configuration, and gives the option of configuring
        ...

1.1.3 练习题

(1)为什么Linux被称作“多用户”操作系统?( )

A.通过使用多个网络连接和哑终端,多个用户可以同时使用同一台机器

B.多个用户可以使用同一台机器,但每次只能由一个用户使用

C.许多人为Linux操作系统的开发做出了贡献

D.Linux没有被称作“多用户”操作系统

(2)以下哪一项不是用虚拟控制台代替图形界面的优势?( )

A.虚拟控制台通常比图形环境反应快

B.虚拟控制台在内核层操作,因此当高层组件配置错误时,可用它来调试系统

C.虚拟控制台有更直观,而且可以很容易地得到帮助

D.图形环境使系统变得更复杂、更难维护

(3)用哪一组组合键可以从第一个虚拟控制台切换到第二个虚拟控制台?( )

A.Ctrl+Alt+2

C.Ctrl+2(使用数字键盘)

B.Ctrl+Alt+F2

D.以上都不可以

(4)哪一组组合键可以从X图形环境切换到第二个虚拟控制台?( )

A.Alt+F2

B.Ctrl+Alt+F2

C.A和B

D.以上都不可以

(5)如果用户已经登录到X图形环境,但却想用终端命令行界面,应该怎么做?( )

A.使用Ctrl+Alt+F3组合键切换到虚拟控制台

B.单击出现在底部面板上的终端图标

C.右键单击桌面,从弹出菜单中选择“Open Terminal”

D.A和C

(6)who命令报告什么信息?( )

A.午夜以来登录到机器上的用户

B.当前登录到机器上的用户,以及从何处登录

C.当前登录到机器上的用户,以及在会话终止前剩余的时间

D.这个命令从一个互联网用户数据库里搜索用户

(7)用ssh打开一个远程Shell时,以下哪一项不必要?( )

A.远程机器必须运行ssh服务

B.你必须知道机器上一个账户的用户名和密码

C.本地机器必须是Linux机器

D.你必须知道远程机器的主机名(hostname)或IP地址

1.2 内核、程序和进程

主要概念

➢ Linux内核是一个操作系统,为进程提供运行环境。

➢ 程序是文件系统内的可执行文件(通常为二进制文件)。

➢ 进程是正在运行程序的实例。

➢ Shell是一个交互式进程,让用户指定要运行的其他进程。

➢ 虽然红帽企业版Linux支持几个不同版本的Shell,但是它的默认Shell是叫做bash的程序。

➢ ps命令列出了从单个终端上启动的进程。ps aux命令提供了当前在机器上运行的所有进程的详细列表。

1.2.1 讲义

1.Linux内核

Linux内核是一个操作系统,就像Windows、Mac OS和OS/2等操作系统一样。操作系统是程序运行的环境,为程序和计算机硬件之间的交互作用提供机制。当按下键盘的键、移动鼠标或程序的信息包通过网络到达时,内核都会通知程序。内核允许程序访问硬盘,例如读取其配置文件或存储的数据。

图1-5 内核和进程

正如很难向只懂一门语言的人解释语言的概念一样,通常很难向计算机新手或者只用过一种操作系统的人解释操作系统的概念。操作系统在底层运作,因此用户和它没有直接的交流,通常也意识不到他们所运行的程序在使用它。

2.程序

程序是储存在计算机硬盘里的文件。一个程序是一系列非常基本的指令,非常详细、明确地告诉操作系统要做什么、何时去做。以下是写在文件/usr/X11R6/bin/xcalc上的指令,是一个普通的计算器程序。

        "While the user isn't doing anything, blink the cursor. When the user hits
    a key, if it's a number, write it to the screen. If it's not a number, ignore it,
    unless it's the return key. If it's the return key, add the previous number to
    the total, and print the total."

当然,这些指令不是用英文或者其他任何人类可读的语言写入的。在底层,计算机只会执行少量的任务,即256个任务。想象一下,每个任务都被编号,从任务0到任务255。程序看起来更像以下的指令:

        "Do task 23. If the result is greater than 0, do task 45. Otherwise, do task
    number 82. Take the result, and store it into memory."

由于计算机可执行的任务取决于不同的CPU,而且由于不同的操作系统用不同的方式对任务进行编号,所以为一种操作系统编译的程序一般不能在另一种操作系统上使用。

3.进程

当用户指示内核运行一个程序时,内核会从程序文件上读取指令,并将这些指令装入内存,然后开始执行这些指令。在内存中运行的这个程序副本叫做进程。注意,同一个程序可以装入内存并运行多次,所以任何时候内核都可能在运行同一程序的几个不同进程。

Linux和大多数现代操作系统一样,是一个多任务操作系统。这说明,Linux内核看起来好像在同时运行多个进程。内核以时间片为单位运行进程。事实上,内核运行一个进程的时间很短,通常是50毫秒。然后把这个进程切换出去,切入另一个进程,再运行50毫秒。最后,内核把所有的进程都运行了一遍,然后重新选择进程进入下一轮循环。进程之间的快速切换使用户觉得所有的进程都在同时运行。

4.Shell

Linux用户经常使用一种叫做Shell的特殊程序与内核进行交互。Shell在终端运行时,会打印一个提示符并等待指示。接着用户输入一个程序的名称,让Shell运行该程序。在下面的例子中,用户elvis让Shell运行一个简单的日历程序cal。Shell遵照指示执行程序,然后将程序的输出显示在终端上:

        [elvis@station elvis]$ cal
              June 2007
        Su Mo Tu We Th Fr Sa
                        1  2
         3  4  5  6  7   8  9
        10 11 12 13 14 15 16
        17 18 19 20 21 22 23
        24 25 26 27 28 29 30
        [elvis@station elvis]$

由于用户可以使用Shell执行系统中几乎所有的任务,所以它是一个既重要又复杂的程序。我们这门课主要学习如何使用Shell有效执行任务。

当用户要求Shell运行程序时,我们说用户向Shell发出命令。Shell通常被称作命令行界面(Command Line Interface)。

5.ps命令

ps命令通常用来列出在系统上运行的进程。没有参数的ps命令显示了在单个终端(或图形环境中的终端窗口)上启动的所有进程。在下面的例子中,用户elvis发现他的终端上当前有两个运行的进程:bash Shell和ps命令本身。

        [elvis@station elvis]$ ps
          PID TTY         TIME  CMD
         1378 pts/1   00:00:00 bash
         1418 pts/1   00:00:00 ps

第一列显示进程的PID,或者叫做进程ID(Process ID)。在系统中运行的每个进程都有一个唯一的PID标识。第二列标识了用户elvis的终端;第三列报告了这个进程消耗了多少CPU时间;第四列标识了进程对应的命令。

ps aux命令显示所有正在系统中运行的进程。现在我们不详细讨论“aux”代表着什么,就当作魔法记住就行。我们也不详细讨论以下的每一列,所有这些都会在以后的教程中讲授。现在只需知道,随时都会有大量的进程在Linux系统中运行(注意,在下面的输出中删去了许多行,用"..."来代替)。

    [elvis@station elvis]$ ps aux
    USER      PID %CPU %MEM VSZ    RSS TTY     STAT  START   TIME    COMMAND
    root        1  0.0  0.1  1388  460 ?       S     18:52   0:04    init [
    root        2  0.0  0.0      0    0 ?      SW    18:52   0:00    [keventd]
    ...
    root      548  0.0  0.2  1460  580 ?       S     18:53   0:00    syslogd -m 0
    root      552  0.0  0.1  1384  428 ?       S     18:53   0:00    klogd -x
    rpc       570  0.0  0.2  1560  552 ?       S     18:53   0:00    portmap
    root      622  0.0  0.2  1496  632 ?       S     18:53   0:00    /sbin/cardmgr
    root      628  0.0  0.0      0    0 ?      SW    18:53   0:00    [kapmd]
    root      633  0.0  0.1  1380  484 ?       S     18:53   0:00    /usr/sbin/apmd-p
    root      644  0.0  0.5  35241512 ?       S     18:53   0:00    /usr/sbin/sshd
    root      655  0.0  0.3   2040   860 ?         S   18:53   0:00 xinetd -stayalive
    root      674  0.0  0.9   6204    2504 ?       S   18:53   0:00 sendmail: accepti
    smmsp     683  0.0  0.8   6004    2256 ?       S   18:53   0:00 sendmail: Queue r
    root      693  0.0  0.1   1424   444 ?         S   18:53   0:00 gpm -t ps/2-m /d
    root      702  0.0  0.2   1580   672 ?         S   18:53   0:00 crond
    xfs       781  0.0  1.5   5272    4004 ?       S   18:53   0:00 xfs -droppriv -da
    root      800  0.0  0.2   3416   544 ?         S   18:53   0:00 rhnsd --interval
    root      807  0.0  0.1   1364   396 tty1      S   18:53   0:00 /sbin/mingetty tt
    ...
    root     1375  0.0  0.3   4120   968 pts/1     S   20:11   0:00 su - elvis
    elvis    1378  0.0  0.5   4324   1404 pts/1    S   20:11   0:00-bash
    elvis    1438  0.0  0.2   2648   696 pts/1     R   20:30   0:00 ps aux

1.2.2 练习题

(1)以下哪一项不是操作系统?( )

A.红帽企业版Linux

C.Microsoft Office

B.Windows 2000

D.Mac OS X

(2)对于Linux操作系统来说,以下哪种说法不正确?( )

A.多个进程好像在同时运行

B.任何给定程序只有一个实例可以作为进程运行

C.程序作为文件保存在文件系统中

D.内核在一个时间只能运行一个实例

(3)以下哪种说法是正确的?( )

A.只有用户root可以从Shell运行进程

B.Shell通常是用来执行其他进程的进程

C.Shell是内核中直接和硬件进行沟通的部分

D.Shell只有一个实例可以作为进程运行

(4)以下哪一项是红帽企业版Linux的默认Shell?( )

A./bin/bash

B./bin/tcsh

C./bin/zsh

D./bin/sh

(5)以下哪一项命令会列出进程?( )

A.ps

B.lsps

C.lps

D.ls

1.3 查看文件系统

主要概念

➢ Linux目录树的基础是一个叫做“/”的目录,被称为“根目录(root directory)”。

➢ 绝对(absolute)文件引用,如“/home/elvis/lsout.txt”,指的是相对于根目录的文件。

➢ 相对(relative)文件引用,如“lsout.txt”,指的是相对于进程中当前工作目录的文件。

➢ ls命令用来列出目录内容。

➢ cat命令用来检查文件内容。

➢ 用Shell命令行的“>”字符可以把命令的输出从终端重定向到文件。

➢ 用户的主目录是用户可以创建新文件的几个地点之一。

1.3.1 讲义

1.文件和目录的命名

在Linux系统中,信息和程序作为文件存储在磁盘上。文件被归类到目录中,目录中包含文件和其他目录(其他操作系统经常将目录称为“文件夹”)。这种包括多层次目录的目录结构经常被称为“目录树(directory tree)”。

目录树的根部是名为“/”的目录,被称作“根目录(root directory)”。根目录中的文件被称作“/filename”。在红帽企业版Linux中,根目录下主要是其他目录,如“/etc”。这些子目录中的文件被称作“/etc/filename”,目录树的每一层都是如此命名的。例如,文件“network”位于目录“sysconfig”中,这个目录位于“etc”中,而“etc”目录又位于“/”中,那么文件的引用为“/etc/sysconfig/network”。

显然,每次都从根目录开始引用文件会很麻烦,幸运的是,Linux提供了一种更简便的方式。每个进程,包括用户的Shell,都用“当前工作目录(current working directory)”作为环境。位于进程当前工作目录的文件可以被直接引用为“filename”,前面不用加斜线。位于当前工作目录的子目录中的文件可引用为dirname/filename,前面也不用加斜线。举例来说,如果进程的当前工作目录是“/etc”,前面提到的文件network,可以被引用为“sysconfig/network”。如果工作目录是“/etc/sysconfig”,那么这个文件就可以简单地引用为“network”。

总而言之,引用文件的方式有两种。相对于根目录的文件引用总是以“/”开头,这种引用方式叫做绝对引用。相对于当前工作目录的文件引用不以“/”开头,这种引用方式叫做相对引用。

2.用ls列出目录内容

用户从Shell使用ls命令列出目录的内容。(ls是动词list(列出)的缩写。)在下面的例子中,用户elvis想列出目录/etc/sysconfig/rhn的内容。

        [elvis@station elvis]$ ls /etc/sysconfig/rhn
        clientCaps.d  install-num  rhnsd  systemid  up2date  virt

在没有参数(即不指定目录)的情况下调用ls命令时,该命令列出Shell当前工作目录的内容。如果使用彩色终端,ls还会以不同颜色显示文件名,帮助区分常规文件(白色)和目录(蓝色)。

ls是一个非常灵活的命令,可以提供大量不同的信息,这将在以后的课程中详细讨论。

3.用cat查看文件内容

ls命令显示一个给定目录中所含的文件,但不会显示这些文件的内容。有几个命令可用来浏览文件内容,最简单的是cat命令。给这个命令一个文件列表,它会将这些文件内容并置(concatenates)输出到终端。如果只给一个文件名,文件的内容会作为输出显示出来。

在下面的例子中,用户elvis想查看配置文件/etc/hosts的内容。

        [elvis@station elvis]$ cat /etc/hosts
        # Do not remove the following line, or various programs
        # that require network functionality will fail.
        127.0.0.1      localhost.localdomain   localhost
        192.168.0.254   server1.example.com  server1
        192.168.0.1    station1.example.com station1

现在不必关心文件的内容是什么,只要意识到cat命令可以显示文件的全部内容就可以了。

如果你指示cat显示一个很长的文件或二进制(非文本)文件,cat命令也会照常执行。还有更好的浏览大型文件的命令,可以逐页浏览,这将在以后的内容中介绍。

4.将命令输出重定向到文件中

当执行ls命令和cat命令时,命令的输出在终端上显示。在Linux系统中,大部分生成文本输出的命令都会使用一个常用的UNIX概念,叫做“标准输出(standard out)”流。在默认状态下,这个数据流连接到终端。bash Shell允许用户将标准输出流“重定向(redirect)”到其他地点。我们现在只学习最简单的方法,使用“>”将标准输出重定向到文件中。

在下面的例子中,用户elvis要再次列出目录/etc/sysconfig/rhn的内容,但是这次他把输出重定向到一个新建的文件中。

        [elvis@station elvis]$ ls /etc/sysconfig/rhn > lsout.txt
        [elvis@station elvis]$ ls
        lsout.txt
        [elvis@station elvis]$ cat lsout.txt
        install-num
        rhnsd
        systemid
        up2date
        virt

命令ls /etc/sysconfig/rhn的输出没有在终端上显示,而是保存到一个名为lsout.txt的文本文件中。用户elvis接着在当前工作目录上使用ls命令查看这个新建的文件,再使用cat命令查看文件内容。用UNIX的说法就是,用户elvis “将ls命令的输出重定向到文件lsout.txt中”。

5.权限和用户的主目录

注意,如果用户elvis试图把输出重定向到Shell当前工作目录以外的文件中,会出现什么情况呢?

        [elvis@station elvis]$ ls /etc/sysconfig/rhn > /etc/lsout.txt
        -bash: /etc/list.txt: Permission denied
        -bash: /etc/list.txt: Permission denied

用户elvis会遇到另一个常见的Linux概念:文件所有权和权限。用户elvis试图创建新文件/etc/lsout.txt,但是他没有在目录/etc中创建文件的权限。

在默认情况下,红帽企业版Linux不允许用户随便在任意地点新建文件。事实上,能够新建文件的地点只有几个。每个用户都有主目录,他们可以在那里创建新文件(和新的子目录)。幸运的是,当用户登录到Linux会话时,Shell将用户的主目录作为它的当前工作目录。在默认情况下,红帽企业版Linux中用户的主目录被命名为“/home/username”,“username”用用户的用户名代替。

我们在以后的教程中会详细讨论文件系统和权限。现在只需知道,用户一般只能在自己的主目录中创建文件。

1.3.2 示例:将命令的输出重定向到文件中

用户prince想用cal命令将本月的日历保存到文件calendar.txt中。

        [prince@station prince]$ cal ①
            June 2007
        Su Mo Tu We Th Fr Sa
                        1  2
        3  4  5  6  7   8  9
         10 11 12 13 14 15 16
         17 18 19 20 21 22 23
         24 25 26 27 28 29 30
         [prince@station prince]$ cal > calendar.txt ②
         [prince@station prince]$ ls ③
         calendar.txt
         [prince@station prince]$ cat calendar.txt ④
            June 2007
         Su Mo Tu We Th Fr Sa
                        1  2
        3  4  5  6  7   8  9
         10 11 12 13 14 15 16
         17 18 19 20 21 22 23
         24 25 26 27 28 29 30

①用户prince先直接查看了cal命令的输出。②用户prince再次运行cal命令,将输出重定向到文件calendar.txt中。

③用户prince列出自己当前工作目录(此处是主目录)的内容,确认这个文件已经被创建。

④用户prince检查这个新建文件的内容,确定它含有cal命令的输出。

1.3.3 练习题

(1)假设Shell的当前工作目录是“/home/elvis”,以下哪一项是对文件/home/elvis/Mail/sent的引用?( )

A.Mail/sent

B./Mail/sent

C.sent

D./sent

(2)用户elvis的Shell当前工作目录是“/home/elvis”,以下哪一项是对文件received的引用?这个文件位于主目录下的Mail目录中。( )

A./home/elvis/Mail/received

C.received

B.Mail/received

D.A和B

(3)以下哪一项命令会列出目录“/usr/lib”中的文件?( )

A.cat /usr/lib

C./usr/lib list

B.lsdir /usr/lib

D.ls /usr/lib

(4)以下哪一项命令会成功地把cal命令的输出重定向到文件lsout.txt中?( )

A.lsout.txt > cal

C.cal > lsout.txt

B.cal ==> lsout.txt

D.cal } lsout.txt

(5)用户elvis的主目录是/home/elvis,以下哪一项命令可以成功地在默认的红帽企业版Linux系统上运行?( )

A.ls /etc > /etc/lsetc.txt

B./etc/lsetc.txt < ls /etc

C.ls /etc > /home/elvis/lsetc.txt

D./home/elvis/lsetc.txt < ls /etc

1.4 运行命令

主要概念

➢ 像任何语言一样,bash Shell使用一种特定的语法。

➢ 任何一个命令行的第一个词都是要运行程序的名称。

➢ 可用命令行选项(通常是任选的)修改命令的行为,命令行选项总是用一个或两个连字符开头(-或--)。

➢ 跟随命令和任何命令行选项的词叫做命令的“参数(argument)”。

➢ 有些命令行选项也带有参数。

➢ 命令通常支持命令行选项“--help”、“-h”和“-?”,这些命令行选项给出如何使用命令的用法概要。

1.4.1 讲义

1.命令行语法

命令行界面有许多优点,包括高效和灵活,但使用起来并不简单。幸好(几乎)所有的程序都遵循惯例。熟悉了这些惯例,学习新的程序就会容易很多。

将输入命令行的命令和英文句子作比较,我们会说命令有动词、副词和直接宾语。动词是要运行的命令;副词是可以修改命令(“静默输出”或“详尽输出”)行为的各种命令行选项;剩余的词是直接宾语(命令执行的对象)。和语言一样,命令行语言有不规则形式,而且任何规则都有例外。

2.命令

命令的第一个词一般是位于文件系统某个位置的、以文件形式存在的一个程序的名称。比如说,在前面的章节中所使用的ps命令和who命令。如果想知道对应哪个文件,可以使用一个叫做which的命令。先输入which命令,接着输入另一个命令的名称,就会发现目标文件。

        [elvis@station elvis]$ which ps
        /bin/ps
        [elvis@station elvis]$ which who
        /usr/bin/who

运行命令时,Shell进程指示内核把指定的程序作为另一个进程分开执行,并将进程的输出(或更准确地说,标准输出流)写到终端。然后Shell暂停,等待命令的进程结束运行。一旦命令结束,Shell会给出另一个提示符,等待下一个命令。

3.命令行选项

许多命令可以指定不同的命令行选项来修改它们的行为,列出目录内容的ls命令就是这样一个简单的例子。看以下ls命令的三种使用方法,每种用法都列出目录/usr中的文件。

        [elvis@station elvis]$ ls /usr
        bin   etc    include    lib      local  share   tmp
        dict  games  kerberos   libexec  sbin   src     X11R6
        [elvis@station elvis]$ ls -s /usr
        total 132
          40 bin     4 games      40 lib         8 sbin     0 tmp
          4 dict     8 include     4 libexec     8 share    4 X11R6
          4 etc      4 kerberos    0 local       4 src
        [elvis@station elvis]$ ls -l /usr
        total 132
        drwxr-xr-x   2 root     root       40960 Apr 25 06:36 bin
        drwxr-xr-x   2 root     root        4096 Jan 24 18:52 dict
        drwxr-xr-x   2 root     root        4096 Jan 24 18:52 etc
        drwxr-xr-x   4 root     root        4096 Jan 24 18:52 games
        drwxr-xr-x  100 root    root        8192 Apr 11 05:55 include
        drwxr-xr-x   8 root     root        4096 Mar 31 21:52 kerberos
        drwxr-xr-x   90 root    root       40960 Apr 25 06:36 lib
        drwxr-xr-x   10 root    root        4096 Apr 11 05:51 libexec
        lrwxrwxrwx   1 root     root           14 Sep 132002 local -> ../home/local/
        drwxr-xr-x   2 root     root        8192 Apr 25 06:36 sbin
        drwxr-xr-x  212 root    root        8192 Apr 23 16:30 share
        drwxrwxr-x   5 root     pst         4096 Apr 25 08:12 src
        lrwxrwxrwx   1 root     root           10 Apr  1 11:07 tmp -> ../var/tmp
        drwxr-xr-x   8 root     root        4096 Jan 24 18:52 X11R6

第一个ls命令只列出目录的内容;第二个ls -s命令包括命令行选项-s,给出内容的大小;第三个ls -l命令显示详细列表,包括文件的各种信息,如所有者、权限和修改时间。我们现在先不必考虑输出的具体内容,这将在第2章有关使用文件系统的教程中讨论。我们现在只需要知道命令行选项可以改变ls命令的基本行为即可。

短命令行选项

注意,以上用到的两个命令行选项-s和-l都是单字母选项,这被称为“短命令行选项”。有时候,短命令行选项也可以带有参数。比如说,ls命令带有命令行选项-w,这个选项指定输出的“宽度(字符个数)”。我们来看下面的例子:

        [elvis@station elvis]$ ls -w 40 /usr/
        bin   games     lib      sbin   tmp
        dict  include   libexec  share  X11R6
        etc   kerberos  local    src

在这里,40不是ls命令的参数,而是命令行选项-w的参数。(输出的宽度应该是多少?40个字符。)命令行选项参数在命令行选项之后。你怎么知道哪个命令行选项带有参数,哪个没有呢?根据经验判断,我们也会很快谈到寻求帮助的方法。

多个短命令行选项

可以同时使用多个命令行选项。多个命令行选项会串在一起,挤在命令和命令参数之间。下面的例子介绍了ls命令的一个新的命令行选项-r,它反转了排列的顺序。我们来看看它如何与选项-s和-w一起使用。

        [elvis@station elvis]$ ls -s -w 40-r /usr/
        total 132
          4 X11R6   0 local        4 games
          0 tmp     4 libexec      4 etc
          4 src     40 lib         4 dict
          8 share   4 kerberos     40 bin
          8 sbin    8 include

有时,在使用多个命令行选项时,用户可以用简写把所有的选项“串”到一个连字符上(-),如下例所示:

        [elvis@station elvis]$ ls -srw 40  /usr/
        total 132
          4 X11R6   0 local        4 games
          0 tmp     4 libexec      4 etc
          4 src     40 lib         4 dict
          8 share   4 kerberos     40 bin
          8 sbin    8 include

所有不带参数的单字符选项(此处是-s和-r)可以串在一起,共用一个“-”。如果选项带有参数,如-w 40,只有将它放在最后,它才能和其他选项共用一个连字符。这样的话,可以在命令行上接着指定它的参数。

长命令行选项

在早期的UNIX操作系统中,所有的命令行选项都使用以上语法。随着UNIX的发展,人们开始意识到他们需要“长命令行选项”。与单字符选项不同的是,长选项由词组成。长选项不是用一个连字符开头,而是用两个连字符(--)开头。有些命令只使用短选项,有些只使用长选项。另外一些命令,如ls命令,两种都可以使用。

        [elvis@station elvis]$ ls --size /usr/
        total 132
          40 bin     4 games        40 lib      8 sbin      0 tmp
          4 dict     8 include      4 libexec   8 share     4 X11R6
          4 etc      4 kerberos     0 local     4 src

长命令行选项带有参数时,其语法会稍有不同。在这种情况下,参数不是作为一个分开的词跟在选项后面,而是和选项连在一起,由“=”隔开,如--width=40。注意,短命令行选项和长命令行选项可以混合使用。

        [elvis@station elvis]$ ls --width=40--size -r  /usr/
        total 132
          4 X11R6   0 local         4 games
          0 tmp     4 libexec       4 etc
          4 src     40 lib          4 dict
          8 share   4 kerberos      40 bin
          8 sbin    8 include

4.参数

与命令行选项相比,参数相对简单。跟在命令名后和命令行选项后的任何词,叫做命令的参数。命令是否需要参数,或需要什么样的参数,取决于命令本身。举例来说,如果在ls命令后加带参数,该命令会把参数作为文件或目录列出。ps命令不需要参数。cal命令可以不带参数,或带1到2个参数,如一个月份一个年份。学习程序需要哪些参数以及如何处理参数是学习如何使用命令的一部分。

5.获取使用帮助

如何记住所有的命令行选项呢?你不需要全部记忆。有经验的Linux用户都知道如何找到适用的选项。大多数命令都支持长命令行选项“--help”以及短命令行选项“-h”或“-?”。这些选项通常会指示命令提供“用法(usage)”信息,而不是执行常规的操作。用法信息是一个关于所需参数、所支持的命令行选项及其意义的概要说明。注意,ls命令生成的用法信息相当长,在下面的输出中许多内容用“…”来代替。

        [elvis@station elvis]$ ls --help
        Usage: ls [OPTION]... [FILE]... ①
        List information about the FILEs (the current directory by default).
        Sort entries alphabetically if none of -cftuSUX②nor --sort.
        Mandatory arguments to long options are mandatory for short options too.
        -a, --all                do not hide entries starting with .
        -A, --almost-all            do not list implied . and ..
            --author             print the author of each file
        -b, --escape             print octal escapes for non-graphic characters
          ...
          -k                      like --block-size=1K
        -l                      use a long listing format
        ...
          -r, --reverse            reverse order while sorting
        -R, --recursive          list subdirectories recursively
        -s, --size ③                 print size of each file, in blocks
          ...
          -v                      sort by version
        -w, --width=COLS ④        assume screen width instead of current value
        -x                      list entries by lines instead of by columns
          ...

用法信息中要注意的几点:

①任选的部分在方括号中([和])。

②此处,用法信息是指使用缩写来表示多个短命令行选项。

③注意:ls命令支持短命令行选项(-s)和长命令行选项(--size)两种形式。

④此处是-w或--width命令行选项,需要参数。

用法信息并不提供命令的完整参考,只是给你足够的信息帮助记忆。在这本教程后面的章节中,我们会讨论更多获取帮助的方法。

1.4.2 示例:学习使用cat命令

用户madonna的朋友告诉她,可以使用cat命令查看文件内容。她以前从没用过这个命令,想学习如何使用它。她先查看了这个命令的用法信息。

                                [madonna@station madonna]$ cat --help
                                Usage: cat [OPTION] [FILE]...
                                Concatenate FILE(s), or standard input, to standard output.
                                  -A, --show-all          equivalent to -vET
                                  -b, --number-nonblank    number nonblank output lines
                                  -e                    equivalent to -vE
                                  -E, --show-ends         display $ at end of each line
                                  -n, --number            number all output lines
                                  -s, --squeeze-blank      never more than one single blank line
                                  -t                    equivalent to -vT
                                  -T, --show-tabs         display TAB characters as ^I
                                  -u                    (ignored)
                                  -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
                                      --help     display this help and exit
                                      --version  output version information and exit
                                With no FILE, or when FILE is -, read standard input.
                                Report bugs to <bug-coreutils@gnu.org>.

她对这些用法信息并不完全理解,比如说里面谈到的标准输入和输出,但她明白第一行,知道cat命令用文件名作为参数。她试着显示文件 /etc/anacrontab的内容。

        [madonna@station madonna]$ cat /etc/anacrontab
        # /etc/anacrontab: configuration file for anacron
        # See anacron(8) and anacrontab(5) for details.
        SHELL=/bin/sh
        PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
        1      65     cron.daily            run-parts /etc/cron.daily
        7      70     cron.weekly           run-parts /etc/cron.weekly
        30     75     cron.monthly          run-parts /etc/cron.monthly

在看了用法信息列出的几个命令行选项后,她注意到命令行选项 -n标出输出行的行数。她试着使用这个命令行选项。

        [madonna@station madonna]$ cat -n /etc/anacrontab
            1   # /etc/anacrontab: configuration file for anacron
            2
            3   # See anacron(8) and anacrontab(5) for details.
            4
            5   SHELL=/bin/sh
            6   PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
            7
            8   1      65     cron.daily            run-parts /etc/cron.daily
            9   7      70     cron.weekly           run-parts /etc/cron.weekly
            10  30     75     cron.monthly          run-parts /etc/cron.monthly

从输出的内容中可以容易地看出文件包含10行,或着容易地查看第6行。她怀疑从第8行到第10行的词之间的空格其实是Tab字符。用法信息中说命令行选项“-t”会用“^I”代替任何Tab字符,她试着证实自己的怀疑。

        [madonna@station madonna]$ cat -t /etc/anacrontab
        # /etc/anacrontab: configuration file for anacron
        # See anacron(8) and anacrontab(5) for details.
        SHELL=/bin/sh
        PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
        1^I65^Icron.daily^I^Irun-parts /etc/cron.daily
        7^I70^Icron.weekly^I^Irun-parts /etc/cron.weekly
        30^I75^Icron.monthly^I^Irun-parts /etc/cron.monthly

她从用法信息中得知,命令行选项-A“和-vET一样”,她认为这是短命令行选项-v、-E和-T的结合。她把两者都试验了一下,看自己的理解是否正确。

        [madonna@station madonna]$ cat -A /etc/anacrontab
        # /etc/anacrontab: configuration file for anacron$
        $
        # See anacron(8) and anacrontab(5) for details.$
        $
        SHELL=/bin/sh$
        PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin$
        $
        1^I65^Icron.daily^I^Irun-parts /etc/cron.daily$
        7^I70^Icron.weekly^I^Irun-parts /etc/cron.weekly$
        30^I75^Icron.monthly^I^Irun-parts /etc/cron.monthly$
        [madonna@station madonna]$ cat -vET /etc/anacrontab
        # /etc/anacrontab: configuration file for anacron$
        $
        # See anacron(8) and anacrontab(5) for details.$
        $
        SHELL=/bin/sh$
        PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin$
        $
        1^I65^Icron.daily^I^Irun-parts /etc/cron.daily$
        7^I70^Icron.weekly^I^Irun-parts /etc/cron.weekly$
        30^I75^Icron.monthly^I^Irun-parts /etc/cron.monthly$

她看到完全一样的输出结果,确定自己对用法信息的理解是正确的。

1.4.3 练习题

touch命令用来更新指定文件上的时间戳。使用以下用法信息和touch命令的调用示例回答后面8个问题。

        [madonna@station madonna]$ which touch
        /bin/touch
        [madonna@station madonna]$ touch --help
        Usage: touch [OPTION]... FILE...
        Update the access and modification times of each FILE to the current time.
        Mandatory arguments to long options are mandatory for short options too.
          -a                  change only the access time
          -B SEC, --backward=SEC date back SEC seconds
          -c, --no-create       do not create any files
          -d, --date=STRING     parse STRING and use it instead of current time
          -F SEC, --forward=SEC  date forward SEC seconds
          -f                  (ignored)
          -m                  change only the modification time
          -r, --reference=FILE   use this file's times instead of current time
          -t STAMP              use [[CC]YY]MMDDhhmm[.ss] instead of current time
          --time=WORD           set time given by WORD: access atime use (same as -a)
                                modify mtime (same as -m)
              --help     display this help and exit
              --version  output version information and exit
        [madonna@station madonna]$ touch -r /etc/services
        touch: file arguments missing
        Try `touch --help' for more information.
        [madonna@station madonna]$ tooch /etc/services
        -bash: tooch: command not found
        [madonna@station madonna]$ touch -k /etc/services
        touch: invalid option -- k
        Try `touch --help' for more information.
        [madonna@station madonna]$ touch -r /etc/services /tmp/foo

(1)以下哪一项是对touch命令的合法调用?( )

A.touch -k /etc/services

C.touch -nocreate /etc/services

B.touch -ac /etc/services

D.touch -t

(2)以下哪一项是对touch命令的合法调用?( )

A.touch -frm /etc/services

C.touch --no-create -a /etc/services

B.touch --cm /etc/services

D.touch

(3)以下哪一项可以最好地解释用户madonna使用touch -r /etc/services的时候会得到“file arguments missing(缺少文件参数)”错误信息的原因?( )

A.命令行选项-r需要参数,用户madonna没有给出

B.文件/etc/services不存在

C.系统中没有touch这个命令

D.命令行选项-r不被支持

(4)以下哪一项可以最好地解释用户madonna使用tooch/etc/services的时候会得到“command not found(找不到命令)”错误信息的原因?( )

A.文件/etc/services不存在

B.用户madonna把命令名拼错了,找不到命令名为tooch的命令

C.命令touch必须带有命令行选项-a

D.用户madonna没有权限执行这个命令

(5)以下哪一项可以最好地解释用户madonna使用touch -k/etc/services的时候会得到“invalid option(选项无效)”错误信息的原因?( )

A.文件/etc/services不存在

B.用户madonna把命令名拼错了,找不到命令名为touch的命令

C.命令touch必须带有命令行选项-a

D.命令touch不支持命令行选项-k

(6)当用户madonna运行命令touch-r/etc/services /tmp/foo时,/etc/services的作用是什么?( )

A.它是命令touch的参数

B.它是命令行选项-r的参数

C.它是要运行的命令的名称

D.拼错了,导致命令无法运行

(7)当用户从命令行上运行who命令时,以下哪一项能够最好地描述出现的情况?( )

A.Shell指示内核将文件/usr/bin/who的内容作为独立的进程来执行,将进程的输出显示在终端上

B.Shell执行名为who的系统调用,直接向Linux内核要输出

C.Shell退出,由进程who代替。进程who结束后,由新的Shell进程代替

(8)使用长命令行选项时,为什么在选项前用双连字符(如--size),而不使用单连字符(如-size)?( )

A.长命令行选项的发明者非常喜欢打字

B.选项-size可能会被误解为短命令行选项-s -i -z -e的快捷方式,而不是单个的长命令行选项

C.单连字符表示强制的命令行选项参数

D.长命令行选项的发明者喜欢把事情复杂化

1.5 管理终端

主要概念

➢ 各种控制键组合,如Ctrl+C、Ctrl+D和Ctrl+Z等,有助于从终端上管理进程。

➢ 通常用reset命令将终端设置恢复为正常状态。

➢ bash Shell提供了Tab补全功能(Tab completion),在指定命令或文件时节省了很多打字时间。

➢ 了解Linux如何引用设备,区分各种类型的终端。

1.5.1 讲义

1.控制终端

bash Shell及其运行的终端是有经验的Linux用户使用的主要工具。这个课程专门有一整章教程讨论bash Shell的强大功能。本节我们介绍终端共有的一些特征和bash Shell极有用的一项功能——Tab补全功能(Tab completion)。

2.复位终端

终端显示信息时,会逐字节显示。计算机在处理人可读文本时,通常使用ASCⅡ格式将字符编码为整数字节值。虽然一个字节最多可以编入256个不同的值,但只有一小部分(大约100个)用作文本字符和标点符号,其他值用来编码控制键组合和其他特殊情况。

有时,用户会不小心(或有意)指示终端显示格式没有被编码为ASCⅡ文本的数据,如图像或可执行文件。终端会尽量执行,但经常出现的是乱码。更麻烦的是,终端可能会死在图形模式中,因此即便是正常的ASCⅡ文本看起来也不可读。

在这种情况下,reset命令可将终端恢复到正常状态。通常当你使用这个命令时,你甚至看不到自己在键入它。但如果在一个不可读的bash提示下,输入reset命令然后按Enter键,可以把终端恢复到正常状态。

3.终端控制组合键

Linux终端与它的前身——电传打字机和“哑终端”或vt100型控制台——有许多相似之处。这些早期的设备有发送“特殊”信号或信号序列的机制,信号序列代表正常键入的字符流以外的一些事件,如后退一格、换行、响铃或信息传递结束。Linux终端和它的前身一样,使用Ctrl键发送这些“特殊”信号。

表1-1总结了所有Linux终端共享的许多常用控制组合键及其常见用法。在这之后我们还会根据其适用性进一步讨论这些控制组合键。

表1-1 Linux终端控制组合键

Ctrl+C

Ctrl+C可能是最有用的组合键,帮助用户停止现在进行的工作。使用bash Shell时,按Ctrl+C可以终止当前运行的进程,返回到bash提示。

设备节点/dev/zero是伪设备,读取时会返回无数个(二进制)零。/dev/null设备节点也是一个伪设备,会丢弃任何写入其中的信息。因此以下命令会永远运行下去,读取零,然后丢弃。处于这种情况的用户可以使用Ctrl+C取消这个命令。

        [elvis@station elvis]$ cat /dev/zero > /dev/null
        (... 用户键入Ctrl+C ...)
        [elvis@station elvis]$

Ctrl+D

在以后的教程中我们会谈到,许多UNIX命令直接从键盘读取输入。但对于新的UNIX用户来说,常常是搞不清楚如何通知命令何时停止读取输入。解决这个问题的办法是用组合键Ctrl+D。这组控制键向读取的进程传送“信息传递完毕”的信号(一般理解为“文件结束”)。

wc命令在没有给出文件名作为参数的情况下,会对用户从键盘输入的行、词和字符进行计数。用户使用组合键Ctrl+D表示输入结束。

        [elvis@station elvis]$ wc
        polly wants a cracker
        polly wants a cracker
        polly wants a cracker
        (... 用户键入Ctrl+D ...)
              3     12     66
        [elvis@station elvis]$

命令wc会负责地报告,用户输入了3行,共有12个词,使用了66个字符(这个功能现在可能没有用,但在以后的教程中我们还会学到更多wc的用法)。如果用户使用Ctrl+C又会怎么样呢?

Ctrl+Z

组合键Ctrl+Z用来挂起程序,挂起的程序可用fg(“foreground(前台)”的缩写)命令恢复。在进行ftp会话时,用户elvis想要确认Shell的当前工作目录。他使用Ctrl+Z挂起正在进行的ftp会话,从Shell运行pwd命令,然后用fg命令恢复ftp会话。

        [elvis@station elvis]$ ftp ftp.redhat.com
        Trying 66.187.232.51...
        Connected to ftp.redhat.com (66.187.232.51).
        220 Red Hat FTP server ready. All transfers are logged. (FTP)
        Name (ftp.redhat.com:elvis): anonymous
        331 Please specify the password.
        Password:
        230 Login successful. Have fun.
        Remote system type is UNIX.
        Using binary mode to transfer files.
        ftp>
        (... 用户键入Ctrl+Z ...)
        [1]+  Stopped               ftp ftp.redhat.com
        [elvis@station elvis]$ pwd
        /home/elvis
        [elvis@station elvis]$ fg
        ftp> ftp.redhat.com
        ftp> ls
        227 Entering Passive Mode (66,187,232,51,67,212)
        150 Here comes the directory listing.
        drwxr-xr-x   6 ftp     ftp         4096 May 24 01:33 pub
        226 Directory send OK.
        ...

以这种方式管理进程是相当复杂的,在以后的教程中我们会再讨论。现在我们只要知道Ctrl+Z用来挂起、fg命令用来恢复就可以了。

Ctrl+U

Ctrl+U一般用来“擦除”当前的行。如果你所在的bash命令行错误繁多,你懒得修改,不如使用Ctrl+U重新来过。如果你输入密码时弄错了,也可以使用Ctrl+U。因为输入的密码不会在屏幕上显示,有时很难知道到底输入了什么,很难改动,不如使用Ctrl+U组合键全部擦除。

Ctrl+H

Ctrl+H和Backspace(退格)键的功能完全一样。但在有些终端上,Backspace键被错误地映射,不能正确工作。而Ctrl+H几乎总是可以在这些情况下正常发挥作用。

Ctrl+L

Ctrl+L传统上用来停止打印当前页并开始下一页。如果使用在线终端,可以用它来刷新屏幕。对于许多基于屏幕的程序而言,包括vi和nano编辑器,如果意外的信息弄乱了显示屏,使用Ctrl+L可以让程序刷新屏幕,正确地重绘屏幕。

在bash Shell中,Ctr+L指示bash清屏,但保留当前的命令行。Ctrl+Q

在Ctrl+S“锁住”屏幕后,Ctrl+Q“解锁”屏幕(让它重新启动)。虽然在使用过Ctrl+Q后,才能用这个组合键,我们先介绍它(作为更有用的命令)是因为,几乎没有人会故意使用Ctrl+S,但新的UNIX用户有的时候会不小心点击Ctrl+S组合键,不明白为什么他们的屏幕会锁住。如果你的机器出现死屏现象,试着使用Ctrl+Q组合键,看能否解锁。

Ctrl+S

见上一项Ctrl+Q。

Ctrl+J

几乎从来不用(一般使用Enter键)。

Ctrl+G

唯一的用途是让终端发出响铃声。

4.识别终端

和其他设备相似,程序通过位于目录/dev的设备节点和终端在底层交流。比如说,使用设备节点/dev/tty1和第一个虚拟控制台交流。大多数进程记录启动它们的终端,用户的登录会话通常与他们使用的终端相关。在辨识这些终端时,终端用它的设备节点来表示,如tty1。

在以下的摘录中,用户elvis使用who命令列出一台机器上的当前用户,他还用ps命令列出在他的终端上运行的当前进程。在这两种情况下,终端都在“TTY”一列中给出。

        [elvis@station elvis]$ who
        root     tty2        Jun 21 10:12
        elvis    tty3        Jun 21 16:50
        blondie  :0          Jun 21 10:13
        blondie  pts/0       Jun 21 16:43 (:0.0)
        blondie  pts/1       Jun 21 10:14 (:0.0)
        blondie  pts/2       Jun 21 10:31 (:0.0)
        blondie  pts/3       Jun 21 10:39 (:0.0)
        [elvis@station elvis]$ ps
          PID TTY         TIME CMD
         4384 tty3    00:00:00 bash
         4427 tty3    00:00:00 ps

Linux将许多设备都当成终端,包括虚拟控制台、串行线连接的VT100终端、调制解调器等。表1-2列出一些常用的终端设备的惯例名称。

表1-2 终端设备名称

5.Tab补全功能

Tab补全功能并不是终端的特征,而是bash Shell的特征。输入命令和文件的名称时,能够熟练使用Tab键,可以节省很多时间和精力。

往bash命令行输入第一个词作为命令名的时候,输入你要执行的命令,在完成之前按Tab键,会出现以下三种情况之一:

1.命令还没有输入的部分自动出现;

2.没输入的命令出现一部分,然后bash会停下来,发出“哔”的声音;

3.bash发出“哔”的声音。

bash Shell尽量从所有可能的命令中帮你选择你正在输入的命令。在第一种情况下,只有一个命令是以你输入的字母开头的,bash能够准确地找到你要执行的命令,帮你补全剩余部分。

在第二种情况和第三种情况下,不止一个命令是以你输入的字母开头的。bash尽量补全命令,但是停下来发出“哔”的声音,提醒你还有其他的选择。要浏览bash已经帮你缩小了的选择范围,再次按Tab键,bash会显示所有以你输入的字母开头的命令。提供进一步信息,让bash能够肯定你所需的命令,再次按Tab键,bash会帮你补全命令。

下面我们来看一个例子。

用户elvis希望为他的终端启用Unicode模式。我们暂且先不管Unicode模式是什么,或者他为什么要启用。你只需要知道启动Unicode模式的命令是unicode_start、停止它的命令是unicode_stop即可。用户elvis输入命令,然后按Tab键。

        [elvis@station elvis]$ unic<TAB>

bash把这个词扩展为unicode_st,然后发出“哔”的响声。为了看到可能的补全列表,用户elvis点击了TAB两次。

        [elvis@station elvis]$ unicode_st<TAB><TAB>
        unicode_start   unicode_stop

bash显示两个以unicode_st开头的命令。用户elvis要执行的是唯一以unicode_sta开头的命令,他输入a,再按Tab键。

        [elvis@station elvis]$ unicode_sta<TAB>

bash补全了命令,闪烁光标,以便可以开始为命令输入任何参数或命令行选项。

        [elvis@station rha030]$ unicode_start

bash不光能使用现有的命令完成命令行的第一个词,它还可以用文件系统中的文件帮你完成命令行的其他部分。例如,用户madonna要查看文件/etc/prelink.conf。她无须输入文件全名,只输入前面的部分,然后按Tab键即可。

        [madonna@station madonna]$ cat /etc/prel<TAB>

因为/etc/prelink.conf是唯一以/etc/prel开头的文件,bash可以补全文件名。

        madonna@station madonna]$ cat /etc/prelink.conf
        # This config file contains a list of directories both with binaries
        # and libraries prelink should consider by default.
        # If a directory name is prefixed with '-l ', the directory hierarchy
        # will be walked as long as filesystem boundaries are not crossed.
        # If a directory name is prefixed with '-h ', symbolic links in a
        # directory hierarchy are followed.
        -l /bin
        -l /usr/bin
          .

随着深入学习这门课程,花点时间熟悉Tab补全功能,可以帮你节省很多时间和精力。用熟以后,使用Tab键会变成本能。一天下来,左手的小拇指因为不断敲击Tab键而变得酸痛。

1.5.2 示例

1.浏览二进制文件后复位终端

用户blondie无意中使用cat命令浏览了一个可执行文件/bin/arch。这是一个编译型可执行文件,含有不应该在终端显示的字节,因此使她的终端变得乱糟糟的。

        [blondie@station blondie]$ cat /bin/arch
        ELF??414
    (44???4????/lib/ld-linux.so.2GNU???y??6,?????aaa????aac????-?????[???
        为了复位终端,用户blondie盲打了reset命令,使终端恢复正常状态。
        [blondie@station blondie]$

2.取消命令

用户prince觉得从根目录“/”开始递归地列出文件系统的内容会很有趣。

        [prince@station prince]$ ls -R /
        /:
        bin   data  etc   initrd  lost+found  mnt  proc  root  sbin  usr  web
        boot  dev   home  lib     misc       opt  rha   RPMS  tmp   var
        /bin:
        arch            cut             gawk        mail      rm          touch
        ash             date            gettext     mkdir     rmdir       true
        ash.static      dd              grep        mknod     rpm         umount
        aumix-minimal   df              gtar        mktemp    rvi         uname
        awk             dmesg           gunzip      more      rview       unicode_start
        basename        dnsdomainname   gzip        mount     sed         unicode_stop
        bash            doexec          hostname    mt        setfont     unlink
        bash2           domainname      igawk       mv        setserial   usleep
        ...

他花了几分钟看文件,觉得看够了,就用Ctrl+C取消命令。命令终止,他返回到bash提示。

        [prince@station prince]$

1.5.3 练习题

(1)以下哪一项命令会把终端恢复到正常状态?( )

A.sanetty

B.reload

C.start-unicode

D.reset

E.sane

(2)以下哪一项控制键组合可以挂起命令?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+Q

D.Ctrl+U

E.Ctrl+Z

(3)如果你见到一个完全没有反应的终端,以下哪一项控制键组合会重新让它活动起来?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+Q

D.Ctrl+U

E.Ctrl+Z

(4)如果你怀疑输入了错误的密码,以下哪一项控制键组合可以让你重头开始?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+Q

D.Ctrl+U

E.Ctrl+Z

(5)如果你要取消一个产生太多输出的命令,以下哪一项控制键组合最有用?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+L

D.Ctrl+S

E.Ctrl+U

(6)如果你想冻结终端输出,以便晚些时候能够继续,以下哪一项控制键组合最有用?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+L

D.Ctrl+S

E.Ctrl+U

(7)以下哪一项控制键组合使bash清屏?( )

A.Ctrl+C

B.Ctrl+D

C.Ctrl+L

D.Ctrl+S

E.Ctrl+U

使用who命令的输出回答下列问题。

      [prince@station prince]$ who
      blondie   tty2      Apr 21 22:07
      elvis     tty1      Apr 21 22:07
      elvis     tty3      Apr 21 22:07
      root      tty6      Apr 21 22:07
      prince    :0        Apr 21 21:50
      prince    pts/0     Apr 21 21:53 (:0.0)
      prince    pts/1     Apr 21 21:54 (:0.0)
      prince    pts/2     Apr 21 21:55 (:0.0)
      madonna   pts/3     Apr 21 22:08 (:0.0)

(8)用户blondie是如何登录企业版Linux机器的?( )

A.使用X图形环境中的登录管理器B.虚拟控制台

C.串行线连接的终端D.ssh网络连接

E.无法从所给信息判断登录方式

(9)用户prince是如何登录企业版Linux机器的?( )

A.使用X图形环境中的登录管理器

B.虚拟控制台

C.串行线连接的终端

D.ssh网络连接

E.无法从所给信息判断登录方式

(10)以下哪一项用户以管理员用户root的身份登录?( )

A.blondie

B.elvis

C.madonna

D.prince

E.从提供的信息中难以判断

1.6 寻求帮助

主要概念

➢ 用-h、-?或--help命令行选项调用命令时,大多数命令都会提供简洁的用法概要信息。

➢ 更详细的参考信息可以使用man命令,在“man page(手册页)”中能够找到。

➢ man page分章节,前面的章节可能会使后面的章节更难理解。

➢ 复杂的命令在info中有更详细的介绍。

➢ 红帽企业版Linux中,与特定软件包相关的不太合乎惯例的文档在/usr/share/doc中。

➢ Linux文档项目(Linux Documentation Project,LDP)提供大量与Linux有关的文档。

➢ 红帽手册针对红帽企业版Linux发行版本提供文档。

1.6.1 讲义

1.寻求帮助

UNIX,特别是Linux的传统做法是不印刷使用手册和文档,而是将它们收藏在系统中,以方便用户使用。没有人能记住ls命令的所有命令行选项,所以当用合适的命令行选项调用命令时,命令都会提供叫做“用法(usages)”的简短概要。大多数命令更完整的参考可以在有结构的“man pages”和“info pages”中找到。在红帽企业版Linux中,针对特定的软件包,目录/usr/share/doc含有结构性不强的文档。最后,你还可以在Linux文档项目或红帽企业版Linux文档包中找到大量的指南和教程。

2.使用-h、-?或--help获得用法

随着不断深入学习这门课程,你会发现UNIX在命名命令和命令选项时,经常会偏向选择简洁、高效的名称,而不是直观、易懂的名称。特别是常用的命令如mv、ps和vi。UNIX的这种命名方针对有经验的用户非常有利,但新手操作就会比较吃亏。

没人能记住全部命令的所有使用方式,但有经验的UNIX用户知道怎样在线快速寻找到他们所需的信息。最直接的帮助经常由命令本身提供。和命令行选项-h、-?或--help一起使用,命令提供“用法(usage)”或简短的语法总结。在前面的章节里我们已经讨论过,在这里我们再回顾一下。

3.Man Page

Manual Page(手册页),一般缩写为“man page”,是UNIX系统的传统参考信息。它包括大多数命令、文件格式、程序调用的文档,一般主题可用man命令浏览。例如:man ls产生有关ls命令的文档。

4.分页程序less

红帽企业版Linux使用less分页程序浏览man page。使用less浏览文件(包括man page)时,使用单一键控制导航:使用空格键浏览下一页,b键回到上一页,q键退出。在以后的课程里还会再讨论less命令,表1-3只列出使用less浏览man page时最有用的导航命令。

表1-3 基本的less导航

man page章节

man page分成8个标准章节,如表1-4所示。在不同章节的页有时会有相同的名字。举例来说,在第1章用户命令中的passwd命令和第5章文件格式中的文件/etc/passwd中都有相应的手册页。用户要找的是/etc/passwd文件格式的相关文档,不幸的是,man passwd只显示首先搜索到的页,在这里是第1章。要浏览第5章中的man page,必须指明章节号man 5 passwd。

表1-4 man page章节

在UNIX中,引用man page通常会在页名后将章数用括号括起来,如passwd(1)或passwd(5)。每章都包括一个叫intro的介绍页,所以命令man 5 intro可查看第5章的介绍页。

关键词搜索和-a选项

经常和man命令同时使用的两个选项是:进行关键词搜索的-k选项和浏览参数的“所有相关”页的-a选项。用户madonna在查找文件/etc/passwd格式的有关信息。她已经试过man passwd,但这个命令只产生passwd命令的man page,她用man -k搜索关键词passwd。

        [madonna@station madonna]$ man -k passwd
        ...
        chpasswd            (8)  - update password file in batch
        gpasswd             (1)  - administer the /etc/group file
        hesiod_free_passwd [hesiod_getpwnam] (3)  - Hesiod functions for retrieving
    passwd information
        hesiod_getpwnam      (3)  -Hesiod functions for retrieving passwd information
        hesiod_getpwuid [hesiod_getpwnam] (3)  - Hesiod functions for retrieving
    passwd
        information
        htpasswd            (1)  - Create and update user authentication files
        ldappasswd          (1)  - change the password of an LDAP entry
        lppasswd            (1)  - add, change, or delete digest passwords
        pam_localuser        (8)  - require users to be listed in /etc/passwd
        passwd              (1)  - update a user's authentication tokens(s)
        passwd              (5)  - password file ①
        passwd [sslpasswd]   (1ssl)  - compute password hashes
        saslpasswd          (8)  - set a user's sasl password
        smbpasswd           (5)  - The Samba encrypted password file
        smbpasswd           (8)  - change a user's SMB password
        ...

①用户madonna找到的信息比她想要的多得多。但在这些输出中包含对password文件的参考,并且告诉她信息可以在man page的第5章找到。

用户madonna现在知道了需要的章节,她使用man 5 passwd找到所需页。用户madonna还可以使用命令行选项-a指示man命令逐个浏览所有相关页。

5.Info Page

man page通常提供参考信息,并不提供指导或一般使用。很多更复杂的命令说明在“info page”中有更详细的记载,“info page”通过超级链接连接不同页面,可以通过类似网页浏览那样根据超级链接跳跃阅读。info page比网络浏览器和可点击的链接出现得早。可以使用传统的info命令或是红帽企业版Linux提供的界面相对易用的pinfo命令浏览info page。info page主要由GNU project开发的软件使用。

不带参数的pinfo命令会显示含有所有安装info page内容的表格。基本导航和分页查看命令less相似。可以使用4个箭头键在info page的链接之间移动,如表1-5所示。

表1-5 pinfo导航

6.目录/usr/share/doc

开放源代码软件的一个设计理念可以总结为“早发行,多发行”。开发软件时,只要软件可以使用,马上就发行,并不一定要等到所有方面都完善。让用户尽早使用软件,从他们那里获得反馈和改进意见,以便设计出更好的软件。

红帽企业版Linux遵照这一基本理念,提供实用、稳定的软件,即使这些软件还没正式被编入man page或info page中。通常,有关如何使用新开发产品的文档可能就在开发者匆忙打造的、名为readme的简单文本文件中。红帽企业版Linux也会包括这些虽组织不完善但实用的文档,这些文档收藏在目录/usr/share/doc下,由包括这个软件的红帽软件包组织管理。

每个软件包的文档有多少要视情况而定。比如说,用户elvis发现PostScript浏览器evince的非正式文档非常简略,只包括开发者的ChangeLog和readme.txt文件。

        [elvis@station elvis]$ ls -s /usr/share/doc/evince-0.6.0/
        total 308
        300 ChangeLog   8 README

与之相比,在目录/usr/share/doc下可以找到大量有关文件共享服务samba复杂配置的信息,包括以不同格式存储在子目录中的文档。

        [elvis@station elvis]$ ls /usr/share/doc/samba-3.0.23c/
        autofs              README
        COPYING             registry
        history             REVISION
        htmldocs            Roadmap
        LDAP                Samba3-ByExample.pdf
        libsmbclient        Samba3-Developers-Guide.pdf
        Manifest            Samba3-HOWTO.pdf
        misc                THANKS
        printer-accounting WHATSNEW.txt
        printing

7.红帽文档指南

作为服务的一部分,红帽公司在红帽企业版Linux中包括文档手册。这些文档手册在互联网上都可以找到。这些文档制成了RPM形式的CD,装在软件包套装中。

● x86安装指南

● 初次使用指南

● 用户定制指南

● 参考指南

● 安全指南

● 系统管理入门

这些手册提供针对红帽企业版Linux操作系统的信息,包括背景资料和不同工作的操作步骤。

8.Linux文档项目

Linux文档项目(Linux Documentation Project,LDP)的工作是将Linux操作系统的快速开发记录归档。这个网站的文档遵循Linux早期开发时所使用的格式。

FAQs

FAQ即有关一个主题的“常见问题(Frequently Asked Questions)”,如Linux-RAID FAQ。

HOWTOs

HOWTOs提供如何逐步设置或配置Linux的各个部分,如CD-Writing-HOWTO或ETHERNET-HOWTO。

GUIDEs

各种Guide(指南)更详细的介绍许多主题,如系统管理(System Administration)或Linux内核模块编程(Linux Kernel Module Programming)。

虽然这些文档并不针对红帽企业版Linux发行版本,但是许多信息还是有用且相关的。

9.yelp:GNOME帮助浏览器

最后,我们来介绍yelp,GNOME帮助浏览器(GNOME Help Brower),从应用程序菜单中选择“帮助”启动这一服务。yelp提供了许多GNOME图形应用程序的主要文档,包括Nautilus File Manager和GNOME支程序。

图1-6 yelp:GNOME帮助浏览器

1.6.2 练习题

(1)以下哪种方式不能获得ls命令的帮助?( )

A.help ls

B.ls --help

C.man ls

D.pinfo ls

E.以上都是获得帮助的合法方式

(2)浏览man page时,使用哪个键使调页程序退出?( )

A.Z

B.TAB

C.q

D.Enter

E.空格键

(3)man page的哪一章含有配置文件/etc/group的文档?( )

A.1

B.4

C.5

D.7

E.8

(4)man page的哪一章含有group命令的文档?( )

A.1

B.4

C.5

D.7

E.8

(5)man page的哪一章含有文件名后缀及后缀所暗示的文件类型?( )

A.1

B.4

C.5

D.7

E.8

(6)列出man page章节的表格中没有第六章。这章的内容是什么?( )

A.UNIX历史(Unix history)

B.硬件设备(hardware devices)

C.网络协议(networking protocoles)

D.图形应用程序(graphical application)

E.游戏(games)

(7)以下哪一项命令产生在man page搜索词sleep的关键字搜索?( )

A.mankey sleep

B.man --key sleep

C.man -key sleep

D.keyword sleep

E.以上都不行

(8)非正式组织的文档位于红帽企业版Linux发行版本的什么位置?( )

A.红帽企业版Linux只包括正式组织的文档

B./usr/share/doc

C./usr/doc

D./usr/doc/share

E./tmp/doc/

(9)如果用户的系统没有安装红帽企业版Linux文档指南,在哪里可以找到这些文档?( )

A.红帽企业版Linux文档CD

B.www.redhat.com网站

C.在盒装的发行版本中的印刷指南中

D.A和C

E.以上都可以

(10)GNOME帮助浏览器yelp提供那种帮助?( )

A.GNOME图形应用程序的文档

B.man pages

C.info pages

D.A和C

E.以上都可以