官术网_书友最值得收藏!

第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.以上都可以

主站蜘蛛池模板: 台中县| 秭归县| 高州市| 汽车| 景泰县| 潢川县| 玛纳斯县| 新河县| 襄樊市| 巨野县| 奉节县| 蛟河市| 信宜市| 彝良县| 德兴市| 普安县| 延安市| 驻马店市| 广安市| 洛浦县| 佛坪县| 射洪县| 和林格尔县| 自治县| 沿河| 唐海县| 南开区| 维西| 武汉市| 枞阳县| 沽源县| 嘉义县| 富平县| 利津县| 定兴县| 株洲市| 泰宁县| 巴马| 龙门县| 于都县| 太仆寺旗|