亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

Linux常用命令和目錄層次結(jié)構(gòu)

2023-06-21 11:13:36 來(lái)源:pythontesting

本章是對(duì)本書中你將遇到的Unix命令和工具的指南。

為什么是Unix命令?這不是一本關(guān)于Linux如何工作的書嗎?當(dāng)然是的,但Linux在本質(zhì)上是一種Unix風(fēng)格。在本章中,你會(huì)看到Unix這個(gè)詞,而不是Linux,因?yàn)槟憧梢园涯銓W(xué)到的東西直接帶到BSD和其他Unix風(fēng)味的系統(tǒng)中去。我試圖避免涉及太多Linux特有的用戶界面擴(kuò)展,這不僅是為了給你使用其他操作系統(tǒng)提供更好的背景,而且也是因?yàn)檫@些擴(kuò)展往往是不穩(wěn)定的。如果你知道核心命令,你就能更快地適應(yīng)新的Linux版本。此外,了解這些命令可以促進(jìn)你對(duì)內(nèi)核的理解,因?yàn)樵S多命令直接對(duì)應(yīng)于系統(tǒng)調(diào)用。


(資料圖片)

注意:如果想了解比這里更多的關(guān)于Unix初學(xué)者的細(xì)節(jié),可以考慮閱讀《The Linux Command Line》第二版(No Starch Press, 2019),《UNIX forthe Impatient》第二版(Addison-Wesley Professional, 1995),以及《Learning the UNIX Operating System,》第五版(O"Reilly, 2001)。

2.1 Bourne Shell: /bin/sh

shell是Unix系統(tǒng)中最重要的部分之一。shell是一個(gè)運(yùn)行命令的程序,就像用戶在終端窗口中輸入的命令。這些命令可以是其他程序或shell的內(nèi)置功能。shell還可以作為小型的編程環(huán)境。Unix程序員經(jīng)常將普通的任務(wù)分解成較小的組件,并使用shell來(lái)管理任務(wù)和拼湊事情。

系統(tǒng)的許多重要部分實(shí)際上是shell腳本--包含shell命令序列的文本文件。如果你以前使用過(guò)MS-DOS,你可以把shell腳本想象成非常強(qiáng)大的.BAT文件。因?yàn)樗鼈兒苤匾?,?1章完全是關(guān)于shell腳本的。

隨著你在本書中的學(xué)習(xí)和實(shí)踐,你會(huì)增加你對(duì)使用shell操作命令的知識(shí)。shell最好的一點(diǎn)是,如果你犯了錯(cuò)誤,你可以很容易地看到你輸入的內(nèi)容,找出錯(cuò)誤的原因,然后再試一次。

有許多不同的Unix shell,但所有的功能都來(lái)自Bourne shell(/bin/sh),這是貝爾實(shí)驗(yàn)室為早期版本的Unix開發(fā)的標(biāo)準(zhǔn)外殼。每個(gè)Unix系統(tǒng)都需要一個(gè)版本的Bourne shell,以便正常運(yùn)行,正如你在本書中看到的那樣。

Linux使用Bourne shell的增強(qiáng)版本,稱為bash或 "Bourne-again "shell。bash shell是大多數(shù)Linux發(fā)行版上的默認(rèn)shell,在Linux系統(tǒng)中,/bin/sh通常是bash的鏈接。在運(yùn)行本書中的例子時(shí),你應(yīng)該使用bash shell。

注意

如果你在一個(gè)你不是系統(tǒng)管理員的組織中使用本章作為Unix賬戶的指南,你可能沒有把bash作為你的默認(rèn)shell。你可以用chsh改變你的shell或者向你的系統(tǒng)管理員尋求幫助。

2.2 使用Shell

當(dāng)你安裝Linux時(shí),你應(yīng)該至少創(chuàng)建一個(gè)普通用戶,作為你的個(gè)人賬戶。在本章中,你應(yīng)該以普通用戶的身份登錄。

2.2.1 Shell窗口

登錄后,打開shell窗口(通常被稱為終端)。從Gnome或KDE這樣的GUI中這樣做的最簡(jiǎn)單方法是打開終端程序,在新窗口中啟動(dòng)shell。一旦你打開了shell,它應(yīng)該在頂部顯示提示,通常以美元符號(hào)()結(jié)尾。在Ubuntu上,這個(gè)提示符應(yīng)該是name@host:path,在Fedora上是[name@host path]$,其中name是你的用戶名,host是你機(jī)器的名字,path是你當(dāng)前的工作目錄(見2.4.1節(jié))。如果你熟悉Windows,shell窗口看起來(lái)就像DOS的命令提示符;在macOS中,終端程序基本上與Linux的shell窗口相同。

本書包含許多你將在shell提示符下輸入的命令。它們都以一個(gè)開頭,表示shell提示符。例如,輸入這個(gè)命令(只輸入粗體部分,不輸入),然后按ENTER鍵:

andrew@andrew-HP:~$ echo Hello there.Hello there.

注意:本書中的許多shell命令以#開頭。你應(yīng)該以超級(jí)用戶(root)的身份運(yùn)行這些命令,所以需要特別小心。在運(yùn)行這些命令時(shí),最好的做法是使用sudo,以便提供一些保護(hù),并有日志,你可以在以后查找可能的錯(cuò)誤。你將在第2.20節(jié)看到如何做到這一點(diǎn)。

現(xiàn)在輸入這個(gè)命令:

andrew@andrew-HP:~$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bash...

這個(gè)命令顯示了/etc/passwd系統(tǒng)信息文件的內(nèi)容,然后返回你的shell提示。現(xiàn)在不要關(guān)注這個(gè)文件的作用,你將在第7章中了解它的全部?jī)?nèi)容。

命令通常以要運(yùn)行的程序開始,后面可能有參數(shù),告訴程序要對(duì)什么進(jìn)行操作以及如何操作。這里,程序是cat,有一個(gè)參數(shù),即/etc/passwd。許多參數(shù)是修改程序默認(rèn)行為的選項(xiàng),通常以破折號(hào)(-)開頭。你很快就會(huì)在討論ls的時(shí)候看到這一點(diǎn)。然而,有一些例外情況并不遵循這種正常的命令結(jié)構(gòu),比如shell的內(nèi)置參數(shù)和環(huán)境變量的臨時(shí)使用。

2.2.2 cat

cat程序是Unix中最容易理解的程序之一;它簡(jiǎn)單地輸出一個(gè)或多個(gè)文件的內(nèi)容或另一個(gè)輸入源。cat命令的一般語(yǔ)法如下:

$ cat file1 file2 ...

當(dāng)你運(yùn)行這個(gè)命令時(shí),cat會(huì)打印file1、file2和任何其他你指定為參數(shù)的文件(在前面的例子中用...表示)的內(nèi)容,然后退出。該程序被稱為cat,因?yàn)樗诖蛴《鄠€(gè)文件的內(nèi)容時(shí)執(zhí)行串聯(lián)操作。有很多方法可以運(yùn)行cat;讓我們用它來(lái)探索Unix的I/O。

2.2.3 標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出

Unix進(jìn)程使用I/O流來(lái)讀和寫數(shù)據(jù)。進(jìn)程從輸入流中讀取數(shù)據(jù),并將數(shù)據(jù)寫到輸出流中。流是非常靈活的。例如,輸入流的源頭可以是一個(gè)文件、一個(gè)設(shè)備、一個(gè)終端窗口,甚至是另一個(gè)進(jìn)程的輸出流。

要看正在工作的輸入流,請(qǐng)輸入cat(沒有參數(shù))并按下ENTER。這一次,你不會(huì)得到任何直接的輸出,你也不會(huì)得到你的shell提示符,因?yàn)閏at仍然在運(yùn)行。現(xiàn)在輸入任何內(nèi)容,并在每一行的末尾按回車鍵。像這樣使用時(shí),cat命令會(huì)重復(fù)你輸入的任何一行。一旦你覺得足夠無(wú)聊,就在一個(gè)空行上按CTRL-D來(lái)終止cat并返回shell提示符。

cat在這里采用交互式行為的原因與流有關(guān)。當(dāng)你沒有指定輸入文件名時(shí),cat從Linux內(nèi)核提供的標(biāo)準(zhǔn)輸入流而不是連接到文件的流中讀取。在這種情況下,標(biāo)準(zhǔn)輸入被連接到你運(yùn)行cat的終端。

注意:在空行上按下CTRL-D會(huì)以EOF(文件結(jié)束)信息停止當(dāng)前終端的標(biāo)準(zhǔn)輸入條目(通常也會(huì)終止一個(gè)程序)。不要把它與CTRL-C混淆,后者通常會(huì)終止一個(gè)程序,而不管其輸入或輸出。

標(biāo)準(zhǔn)輸出是類似的。內(nèi)核給每個(gè)進(jìn)程一個(gè)標(biāo)準(zhǔn)輸出流,它可以在那里寫出它的輸出。cat命令總是把它的輸出寫到標(biāo)準(zhǔn)輸出。當(dāng)你在終端運(yùn)行cat時(shí),標(biāo)準(zhǔn)輸出被連接到該終端,所以你在那里看到了輸出。

標(biāo)準(zhǔn)輸入和輸出通常被縮寫為stdin和stdout。許多命令的操作與cat一樣;如果你不指定輸入文件,命令就從stdin中讀取。輸出則有些不同。一些程序(如cat)只將輸出發(fā)送到stdout,但其他程序可以選擇將輸出直接發(fā)送到文件。

還有第三個(gè)標(biāo)準(zhǔn)I/O流,叫做標(biāo)準(zhǔn)錯(cuò)誤。你會(huì)在第2.14.1節(jié)看到它。

標(biāo)準(zhǔn)流的最好的特點(diǎn)是,你可以很容易地操縱它們來(lái)讀寫終端以外的地方,你將在第2.14節(jié)中學(xué)習(xí)。特別是,你將學(xué)習(xí)如何將流連接到文件和其他進(jìn)程。

2.3 基本命令

現(xiàn)在讓我們來(lái)看看更多的Unix命令。這是基本命令的簡(jiǎn)化列表,沒涉及到細(xì)節(jié)。

2.3.1 ls

ls命令列出了目錄的內(nèi)容。默認(rèn)情況下是當(dāng)前目錄,但你可以添加任何目錄或文件作為參數(shù),而且有許多有用的選項(xiàng)。例如,使用ls -l來(lái)獲得詳細(xì)的(長(zhǎng))列表,使用ls -F來(lái)顯示文件類型信息。下面是一個(gè)長(zhǎng)列表的例子;它包括文件的所有者(第3列),組(第4列),文件大小(第5列),以及修改日期/時(shí)間(在第5列和文件名之間):

andrew@andrew-HP:~$ ls -ltotal 119228-rwxrwxrwx  1 andrew andrew      108 11月 10  2022  a-cov.gcda-rwxrwxrwx  1 andrew andrew      676 11月 10  2022  a-cov.gcno-rwxrwxrwx  1 andrew andrew    27248 11月 10  2022  a.out-rw-rw-r--  1 andrew andrew     1949  2月 15 14:31  base.htmldrwxrwxr-x  5 andrew andrew     4096  5月 27 07:20 "Calibre 書庫(kù)"drwxrwxrwx 24 andrew andrew     4096  5月 11 15:04  code...

你將在第2.17節(jié)中了解更多關(guān)于該輸出的第1列。你可以暫時(shí)忽略第2列;它是指向文件的硬鏈接的數(shù)量,在第4.6節(jié)中有解釋。

2.3.2 cp

在其最簡(jiǎn)單的形式中,cp復(fù)制文件。例如,要將file1復(fù)制到file2,請(qǐng)輸入以下內(nèi)容:

$ cp file1 file2

你也可以把一個(gè)文件復(fù)制到另一個(gè)目錄,在該目錄中保持相同的文件名:

$ cp file dir

要復(fù)制一個(gè)以上的文件到名為dir的目錄(文件夾)中,請(qǐng)嘗試像這樣的例子,復(fù)制三個(gè)文件:

$ cp file1 file2 file3 dir

2.3.3 mv

mv(移動(dòng))命令的工作原理與cp很相似。在其最簡(jiǎn)單的形式中,它重命名文件。例如,要把file1重命名為file2,請(qǐng)輸入以下內(nèi)容:

$ mv file1 file2

2.3.4 touch

touch命令可以創(chuàng)建文件。如果目標(biāo)文件已經(jīng)存在,touch不會(huì)改變?cè)撐募?,但?huì)更新該文件的修改時(shí)間戳。例如,要?jiǎng)?chuàng)建空文件,可以這樣輸入:

$ touch file

然后在該文件上運(yùn)行l(wèi)s -l。你應(yīng)該看到像下面這樣的輸出,其中的日期和時(shí)間表示你運(yùn)行觸摸的時(shí)間:

$ touch file$ ls -l file-rw-rw-r-- 1 andrew andrew 0  5月 27 11:20 file

要看到時(shí)間戳的更新,至少要等一分鐘,然后再運(yùn)行同樣的touch命令。ls -l返回的時(shí)間戳?xí)隆?/p>

2.3.5 rm

rm命令刪除(移除)文件。在你刪除文件后,它通常會(huì)從你的系統(tǒng)中消失,除非你從備份中恢復(fù)它。

$ rm file

2.3.6 echo

echo命令將其參數(shù)打印到標(biāo)準(zhǔn)輸出:

$ echo Hello again.Hello again.

echo命令對(duì)于查找shell globs("通配符",如*)和變量(如$HOME)的擴(kuò)展非常有用,你在本章后面會(huì)遇到這些情況。

2.4 瀏覽目錄

Unix的目錄層次結(jié)構(gòu)從/開始,也稱為根目錄。目錄的分隔符是斜線(/),而不是反斜線(\\)。在根目錄下有幾個(gè)標(biāo)準(zhǔn)的子目錄,如/usr,你將在第2.19節(jié)中學(xué)習(xí)。

當(dāng)你引用文件或目錄時(shí),你指定路徑或路徑名。當(dāng)路徑以/開頭時(shí)(如/usr/lib),它是完整或絕對(duì)的路徑。

由兩個(gè)點(diǎn)(...)標(biāo)識(shí)的路徑組件指定一個(gè)目錄的父級(jí)。例如,如果你在/usr/lib中工作,路徑..指的是/usr。同樣地,../bin指的是/usr/bin。

點(diǎn)(.)指的是當(dāng)前目錄;例如,如果你在/usr/lib,路徑.仍然是/usr/lib,而./X11是/usr/lib/X11。你不會(huì)經(jīng)常使用.,因?yàn)槿绻窂讲皇且?開頭,大多數(shù)命令都默認(rèn)為當(dāng)前目錄(所以你可以在前面的例子中直接使用X11而不是./X11)。

不以/開頭的路徑被稱為相對(duì)路徑。大多數(shù)時(shí)候,你會(huì)使用相對(duì)路徑名,因?yàn)槟阋呀?jīng)在你需要的目錄中或附近。

現(xiàn)在你已經(jīng)對(duì)基本的目錄機(jī)制有了了解,下面是一些基本的目錄命令。

cd

當(dāng)前工作目錄是一個(gè)進(jìn)程(如shell)當(dāng)前所處的目錄。除了大多數(shù)Linux發(fā)行版中默認(rèn)的shell提示外,你還可以用2.5.3節(jié)中描述的pwd命令查看你的當(dāng)前目錄。

每個(gè)進(jìn)程都可以獨(dú)立設(shè)置自己的當(dāng)前工作目錄。cd命令可以改變shell的當(dāng)前工作目錄:

$ cd dir

如果你省略了dir,shell將返回到你的主目錄,即你第一次登錄時(shí)開始的目錄。有些程序會(huì)用~符號(hào)(tilde)來(lái)簡(jiǎn)寫你的主目錄。

注意: cd命令是shell的內(nèi)置命令。它不能作為單獨(dú)的程序工作,因?yàn)槿绻鳛樽舆M(jìn)程運(yùn)行,它不能(通常)改變其父級(jí)的當(dāng)前工作目錄。

2.4.2 mkdir

mkdir命令創(chuàng)建新的目錄:

$ mkdir dir

2.4.3 rmdir

rmdir命令可以刪除目錄dir:

$ rmdir dir

如果dir不是空的,這個(gè)命令就會(huì)失敗。然而,如果你沒有耐心,你可能不想先費(fèi)力地刪除dir里面的所有文件和子目錄。你可以使用rm -r dir來(lái)刪除目錄和它的內(nèi)容,但要小心!這是少數(shù)幾個(gè)可以造成嚴(yán)重破壞的命令之一,特別是當(dāng)你以超級(jí)用戶身份運(yùn)行它時(shí)。-r選項(xiàng)指定了遞歸刪除,重復(fù)刪除dir中的所有內(nèi)容。不要將-r標(biāo)志與星號(hào)(*)等globs一起使用。最重要的是,在運(yùn)行你的命令之前一定要仔細(xì)檢查。

2.4.4 Shell的globbing("通配符")

shell可以將簡(jiǎn)單的模式與文件和目錄名相匹配,這個(gè)過(guò)程被稱為 "通配"。這與其他系統(tǒng)中的通配符的概念相似。其中最簡(jiǎn)單的是glob字符*,它告訴shell去匹配任何數(shù)量的任意字符。例如,下面的命令可以打印出當(dāng)前目錄下的文件列表:

$ echo *

shell將包含globs的參數(shù)與文件名相匹配,將文件名替換為這些參數(shù),然后運(yùn)行修改后的命令行。這種替換被稱為擴(kuò)展,因?yàn)閟hell將所有匹配的文件名替換為一個(gè)簡(jiǎn)化的表達(dá)式。下面是一些使用*來(lái)擴(kuò)展文件名的方法:

at*擴(kuò)展到所有以at開頭的文件名。*at擴(kuò)展到所有以at結(jié)尾的文件名。at擴(kuò)展到所有包含at的文件名。

另一個(gè)shell glob字符,問(wèn)號(hào)(?),指示shell精確匹配一個(gè)任意字符。例如,b?at匹配boat和brat。

如果你不希望shell在命令中擴(kuò)展一個(gè)glob,可以用單引號(hào)("")把這個(gè)glob括起來(lái)。例如,命令echo "*"可以打印出一顆星。你會(huì)發(fā)現(xiàn)這對(duì)下一節(jié)中描述的一些命令很方便,例如grep和find。(你將在第11.2節(jié)中學(xué)習(xí)更多關(guān)于引號(hào)的知識(shí))。

注意:重要的是要記住,shell在運(yùn)行命令前會(huì)進(jìn)行擴(kuò)展,而且只在這時(shí)進(jìn)行。因此,如果一個(gè) "*"沒有被擴(kuò)展到命令中,shell不會(huì)對(duì)它做任何事情;而是由命令來(lái)決定它要做什么。

shell的模式匹配能力還有很多,但是*和? 是你現(xiàn)在需要知道的。第2.7節(jié)描述了那些以點(diǎn)開頭的有趣文件的glob行為。

2.5 中級(jí)命令

這一節(jié)描述了最基本的Unix中級(jí)命令。

2.5.1 grep

grep命令打印文件或輸入流中與某個(gè)表達(dá)式相匹配的行。例如,要打印/etc/passwd文件中包含文本root的行,請(qǐng)輸入以下內(nèi)容:

$ grep root /etc/passwd

grep命令在同時(shí)對(duì)多個(gè)文件進(jìn)行操作時(shí)特別方便,因?yàn)樗舜蛴∑ヅ涞男型猓€打印文件名。例如,如果你想檢查/etc中包含root這個(gè)詞的每個(gè)文件,你可以使用這個(gè)命令:

$ grep root /etc/*

兩個(gè)最重要的grep選項(xiàng)是-i(用于不區(qū)分大小寫的匹配)和-v(反轉(zhuǎn)搜索,即打印所有不匹配的行)。還有一個(gè)更強(qiáng)大的變體,叫做egrep(它只是grep -E的一個(gè)同義詞)。

grep能夠理解正則表達(dá)式,這些模式以計(jì)算機(jī)科學(xué)理論為基礎(chǔ),在Unix工具中非常常見。正則表達(dá)式比通配符式的模式更強(qiáng)大,而且它們有不同的語(yǔ)法。關(guān)于正則表達(dá)式,有三件重要的事情需要記?。?/p>.* 匹配任何數(shù)量的字符,包括沒有字符(像globs和通配符中的*)。.+ 匹配任何一個(gè)或多個(gè)字符。.精確匹配一個(gè)任意字符。

注意: grep(1) 手冊(cè)頁(yè)包含了對(duì)正則表達(dá)式的詳細(xì)描述,但它可能有些難以閱讀。要了解更多信息,你可以閱讀Jeffrey E. F. Friedl編寫的《Mastering Regular Expressions》第三版(O"Reilly,2006年),或者參見Tom Christensen等人編寫的《Programming Perl》第四版(O"Reilly,2012年)的正則表達(dá)式章節(jié)。如果你喜歡數(shù)學(xué),并且對(duì)正則表達(dá)式的來(lái)源感興趣,可以看看Jeffrey Ullman和John Hopcroft的《AutomataTheory, Languages, and Computation》第三版(Prentice Hall,2006)。

2.5.2 less

當(dāng)文件非常大,或者命令的輸出很長(zhǎng),并且滾動(dòng)到屏幕上方時(shí),less命令就會(huì)派上用場(chǎng)。

要翻閱像/usr/share/dict/words這樣的大文件,你可以使用命令less /usr/share/dict/words。當(dāng)運(yùn)行 less 時(shí),你會(huì)看到文件的內(nèi)容,每次都是一屏。按空格鍵可以往前看文件,按b(小寫)可以往后跳一個(gè)屏幕。要退出,按q。

注意:less命令是一個(gè)名為more的舊程序的增強(qiáng)版。Linux臺(tái)式機(jī)和服務(wù)器有l(wèi)ess,但它在許多嵌入式系統(tǒng)和其他Unix系統(tǒng)中不是標(biāo)準(zhǔn)配置。如果你遇到了不能使用less的情況,可以試試more。

你也可以在less里面搜索文本。例如,要向前搜索一個(gè)單詞,你可以輸入/word,要向后搜索,你可以使用?word。當(dāng)你找到一個(gè)匹配詞時(shí),按n繼續(xù)搜索。

正如你在第2.14節(jié)中所了解的,你可以將幾乎所有程序的標(biāo)準(zhǔn)輸出直接發(fā)送到另一個(gè)程序的標(biāo)準(zhǔn)輸入。當(dāng)你有命令有大量的輸出需要篩選,而你又想用 less 這樣的東西來(lái)查看輸出時(shí),這就特別有用。下面是將grep命令的輸出發(fā)送到less的例子:

$ grep ie /usr/share/dict/words | less

2.5.3 pwd

pwd(打印工作目錄)程序只是輸出當(dāng)前工作目錄的名稱。你可能想知道為什么你需要這個(gè),因?yàn)榇蠖鄶?shù)Linux發(fā)行版都在提示符中設(shè)置了用戶賬戶的當(dāng)前工作目錄。有兩個(gè)原因。

首先,不是所有的提示符都包括當(dāng)前工作目錄,特別是你可能想在自己的提示符中去掉它,因?yàn)樗加昧撕芏嗫臻g。

第二,你將在第2.17.2節(jié)中了解到的符號(hào)鏈接有時(shí)會(huì)掩蓋當(dāng)前工作目錄的真正完整路徑。使用pwd -P來(lái)消除這種混淆。

2.5.4 diff

要查看兩個(gè)文本文件之間的差異,可以使用diff:

$ diff file1 file2

有幾個(gè)選項(xiàng)可以控制輸出的格式,默認(rèn)的輸出格式往往是人類最容易理解的。然而,大多數(shù)程序員在需要將輸出結(jié)果發(fā)送給別人時(shí),更喜歡diff -u的輸出,因?yàn)樽詣?dòng)化工具更容易處理這種格式。

2.5.5 file

如果你看到一個(gè)文件,但不確定它的格式,可以嘗試使用file命令,看看系統(tǒng)是否能猜到它:

$ file file

你可能會(huì)對(duì)這個(gè)看起來(lái)很單純的命令的作用感到驚訝。

2.5.6 查找和定位

當(dāng)你知道某個(gè)文件在某個(gè)目錄樹下,但你不知道在哪里時(shí),這是很令人沮喪的。運(yùn)行find來(lái)查找dir中的文件,方法如下:

$ find dir -name file -print

像本節(jié)中的大多數(shù)程序一樣,find能做一些花哨的事情。然而,在你熟知這里顯示的形式并理解為什么你需要-name和-print選項(xiàng)之前,不要嘗試諸如-exec之類的選項(xiàng)。find命令接受特殊的模式匹配字符,如 ,但你必須用單引號(hào)("")將它們括起來(lái),以保護(hù)這些特殊字符不被shell自己的globbing功能所影響。(回顧一下第2.4.4節(jié),shell在運(yùn)行命令之前會(huì)展開globs)。

大多數(shù)系統(tǒng)也有查找文件的locate命令。locate不是實(shí)時(shí)搜索文件,而是搜索系統(tǒng)定期建立的索引。用locate搜索要比f(wàn)ind快得多,但是如果你要找的文件比索引要新,locate就找不到它。

2.5.7 head和tail

head和tail命令允許你快速查看文件或數(shù)據(jù)流的一部分。例如,head /etc/passwd顯示密碼文件的前10行,tail /etc/passwd顯示最后10行。

要改變顯示的行數(shù),使用-n選項(xiàng),其中n是你想看的行數(shù)(例如,head -5 /etc/passwd)。要打印從第n行開始的行,使用tail +n。

2.5.8 sort

sort命令可以快速將文本文件的行數(shù)按字母數(shù)字順序排列。如果文件的行以數(shù)字開頭,并且你想按數(shù)字順序排序,使用-n選項(xiàng)。r選項(xiàng)可以反轉(zhuǎn)排序的順序。

2.6 改變你的密碼和shell

使用passwd命令來(lái)改變你的密碼。你會(huì)被要求提供你的舊密碼,然后兩次提示你的新密碼。

最好的密碼往往是容易記住的長(zhǎng) "廢話 "句子。密碼越長(zhǎng)(就字符長(zhǎng)度而言)越好;嘗試16個(gè)字符或更多。(在以前,你可以使用的字符數(shù)是有限的,所以建議你增加一些奇怪的字符之類的。)

你可以用chsh命令來(lái)改變你的shell(比如zsh、ksh或tcsh),但請(qǐng)記住,本書假設(shè)你運(yùn)行的是bash,所以如果你做了改變,一些例子可能就不能用了。

Dot文件(隱藏文件)

如果你還沒有進(jìn)入你的主目錄,就換成ls來(lái)看看,然后運(yùn)行l(wèi)s -a。你看到輸出的不同了嗎?當(dāng)你運(yùn)行l(wèi)s而不使用-a時(shí),你不會(huì)看到被稱為點(diǎn)文件的配置文件。這些文件和目錄的名稱都是以點(diǎn)(.)開頭的。常見的點(diǎn)文件有.bashrc和.login,還有一些點(diǎn)目錄,如.ssh。

點(diǎn)狀文件或目錄沒有什么特別之處。一些程序默認(rèn)不顯示它們,這樣你在列出你的主目錄的內(nèi)容時(shí)就不會(huì)看到一個(gè)完整的混亂。例如,除非你使用-a選項(xiàng),否則ls不會(huì)列出點(diǎn)文件。此外,除非你明確使用模式,如.*,否則shell globs不匹配點(diǎn)狀文件。

注意:你可能會(huì)遇到globs的問(wèn)題,因?yàn)? 匹配.和.(當(dāng)前和父目錄)。你可能希望使用諸如.[^.]或.??*的模式來(lái)獲取除當(dāng)前和父目錄之外的所有點(diǎn)狀文件。

2.8 環(huán)境和外殼變量

shell可以存儲(chǔ)臨時(shí)變量,稱為shell變量,包含文本字符串的值。shell變量對(duì)于跟蹤腳本中的數(shù)值非常有用,而且一些shell變量可以控制shell的行為方式。(例如,bash shell在顯示提示符之前會(huì)讀取PS1變量)。

要給shell變量賦值,可以使用等號(hào)(=)。下面是一個(gè)簡(jiǎn)單的例子:

$ STUFF=blah

前面的例子將名為STUFF的變量的值設(shè)置為blah。要訪問(wèn)這個(gè)變量,使用**STUFF(例如,嘗試運(yùn)行echo **STUFF)。你將在第11章中了解到shell變量的許多用途。

注意:在分配變量時(shí),不要在=的周圍加上任何空格。

環(huán)境變量就像shell變量一樣,但它并不是專門針對(duì)shell的。Unix系統(tǒng)中的所有進(jìn)程都有環(huán)境變量存儲(chǔ)。環(huán)境變量和shell變量的主要區(qū)別是,操作系統(tǒng)會(huì)將shell的所有環(huán)境變量傳遞給shell運(yùn)行的程序,而shell變量不能在你運(yùn)行的命令中被訪問(wèn)。

你用shell的導(dǎo)出命令指定一個(gè)環(huán)境變量。例如,如果你想把$STUFF這個(gè)shell變量變成一個(gè)環(huán)境變量,可以用下面的方法:

$ STUFF=blah$ export STUFF

由于子進(jìn)程繼承了父進(jìn)程的環(huán)境變量,許多程序會(huì)讀取它們的配置和選項(xiàng)。例如,你可以把你最喜歡的less命令行選項(xiàng)放在LESS環(huán)境變量中,當(dāng)你運(yùn)行l(wèi)ess時(shí)就會(huì)使用這些選項(xiàng)。(許多手冊(cè)中都有一個(gè)名為 "環(huán)境 "的章節(jié)來(lái)描述這些變量)。

2.9 命令路徑

PATH是一個(gè)特殊的環(huán)境變量,它包含了命令路徑(簡(jiǎn)稱path),這是系統(tǒng)目錄列表,shell在試圖找到一個(gè)命令時(shí),會(huì)搜索這個(gè)目錄。例如,當(dāng)你運(yùn)行l(wèi)s時(shí),shell會(huì)在PATH中列出的目錄中搜索ls程序。如果同名的程序出現(xiàn)在路徑中的幾個(gè)目錄中,shell會(huì)運(yùn)行第一個(gè)匹配的程序。

如果你運(yùn)行echo $PATH,你會(huì)看到路徑的組成部分是由冒號(hào)(:)分隔的。比如說(shuō)

$ echo $PATH/usr/local/bin:/usr/bin:/bin

要告訴shell在更多的地方尋找程序,可以改變PATH環(huán)境變量。例如,通過(guò)使用這個(gè)命令,你可以在路徑的開頭添加目錄dir,這樣shell就會(huì)在尋找其他PATH目錄之前尋找dir:

$ PATH=dir:$PATH

或者你可以在PATH變量的末尾加上目錄名,使Shell最后查找dir:

$ PATH=$PATH:dir

注意:如果你在修改路徑時(shí)錯(cuò)誤地輸入了$PATH,你可能會(huì)意外地抹去整個(gè)路徑。如果發(fā)生這種情況,不要驚慌! 這種損害不是永久性的;你可以啟動(dòng)一個(gè)新的shell。(為了達(dá)到持久的效果,你需要在編輯某個(gè)配置文件時(shí)輸入錯(cuò)誤,即使這樣也不難糾正)。恢復(fù)正常的最簡(jiǎn)單方法是關(guān)閉當(dāng)前的終端窗口并啟動(dòng)另一個(gè)。

特殊字符

當(dāng)與他人討論Linux時(shí),你應(yīng)該知道一些你會(huì)遇到的特殊字符的名稱。如果你對(duì)這種事情感到有趣,請(qǐng)看 "Jargon File"(http://www.catb.org/jargon/html/)或其印刷品,《The New Hacker’s Dictionary》,第三版,作者Eric S. Raymond(MIT Press,1996)。

注意: 你經(jīng)常會(huì)看到控制字符用圓點(diǎn)標(biāo)記;例如,^C代表CTRL-C。

2.11 命令行編輯

當(dāng)你使用shell的時(shí)候,注意到你可以使用左右方向鍵來(lái)編輯命令行,也可以使用上下箭頭來(lái)翻閱以前的命令。這在大多數(shù)Linux系統(tǒng)中是標(biāo)準(zhǔn)的。

CTRL-B 將光標(biāo)向左移動(dòng)CTRL-F 將光標(biāo)向右移動(dòng)CTRL-P 查看上一條命令(或?qū)⒐鈽?biāo)上移)。CTRL-N 查看下一個(gè)命令(或?qū)⒐鈽?biāo)向下移動(dòng))CTRL-A 將光標(biāo)移至行首CTRL-E 將光標(biāo)移至行尾CTRL-W 擦除前面的單詞CTRL-U 從光標(biāo)到行首的擦除CTRL-K 從光標(biāo)處擦除到行尾處CTRL-Y 粘貼被擦除的文字(例如,從CTRL-U)。

2.12 文本編輯器

兩個(gè)事實(shí)上的標(biāo)準(zhǔn)Unix文本編輯器,即vi和Emacs。大多數(shù)Unix向?qū)?duì)他們選擇的編輯器很虔誠(chéng),但不要聽他們的。只要自己選擇就好。如果你選擇一個(gè)與你的工作方式相匹配的,你會(huì)發(fā)現(xiàn)它更容易學(xué)習(xí)。基本上,選擇歸結(jié)于此:

如果你想要一個(gè)幾乎可以做任何事情的編輯器,并且有廣泛的在線幫助,而且你不介意做一些額外的輸入來(lái)獲得這些功能,那就試試Emacs。

如果速度就是一切,那就試試vi;它 "玩 "起來(lái)有點(diǎn)像電子游戲。

學(xué)習(xí)vi和Vim編輯器: 阿諾德-羅賓斯、埃爾伯特-漢納和琳達(dá)-拉姆所寫的《Unix Text Processing》第七版(O"Reilly,2008),可以告訴你關(guān)于vi的一切。對(duì)于Emacs,使用在線教程:?jiǎn)?dòng)Emacs,按CTRL-H,然后輸入T?;蛘唛喿x《GNU Emacs Manual》第18版,作者是理查德-M-斯塔爾曼(自由軟件基金會(huì),2018)。

還有一些更友好的編輯器,比如nano、Pico等。

注意:編輯文本是你第一次開始看到終端和GUI之間的區(qū)別的地方。像vi這樣的編輯器在終端窗口內(nèi)運(yùn)行,使用標(biāo)準(zhǔn)的終端I/O接口。GUI編輯器啟動(dòng)他們自己的窗口并展示他們自己的界面,獨(dú)立于終端。Emacs默認(rèn)在GUI中運(yùn)行,但也會(huì)在終端窗口中運(yùn)行。

2.13 獲得在線幫助

Linux系統(tǒng)有大量的文檔。對(duì)于基本的命令,手冊(cè)頁(yè)(或稱man頁(yè))會(huì)告訴你你需要知道的東西。例如,要查看ls命令的手冊(cè)頁(yè),請(qǐng)按以下方式運(yùn)行man:

$ man ls

大多數(shù)手冊(cè)頁(yè)主要集中在參考信息上,也許有一些例子和交叉引用,但僅此而已。不要指望有什么教程,也不要指望有什么吸引人的文學(xué)風(fēng)格。

當(dāng)程序有許多選項(xiàng)時(shí),手冊(cè)頁(yè)往往以某種系統(tǒng)的方式(例如,按字母順序)列出選項(xiàng),但它不會(huì)告訴你哪些是重要的選項(xiàng)。如果你有耐心,你通常可以在手冊(cè)頁(yè)中找到你需要知道的東西。如果你沒有耐心,可以問(wèn)朋友,或者花錢請(qǐng)人做你的朋友,這樣你就可以問(wèn)他或她。

要按關(guān)鍵詞搜索手冊(cè)頁(yè),使用-k選項(xiàng):

$ man -k keyword

如果你不太清楚你想要的命令的名稱,這很有幫助。例如,如果你正在尋找一條對(duì)某物進(jìn)行排序的命令,可以運(yùn)行:

$ man -k sort--snip--comm (1) - compare two sorted files line by lineqsort (3) - sorts an arraysort (1) - sort lines of text filessortm (1) - sort messagestsort (1) - perform topological sort--snip--

輸出包括手冊(cè)頁(yè)面名稱、手冊(cè)章節(jié)(見下文),以及對(duì)手冊(cè)頁(yè)面所含內(nèi)容的快速描述。

注意:如果你對(duì)前面章節(jié)中描述的命令有任何疑問(wèn),你可以通過(guò)使用man命令找到答案。

手冊(cè)頁(yè)是通過(guò)編號(hào)的章節(jié)來(lái)引用的。當(dāng)有人提到手冊(cè)頁(yè)面時(shí),他們通常把章節(jié)編號(hào)放在名稱旁邊的括號(hào)里,比如ping(8)。表2-3列出了這些章節(jié)和它們的編號(hào)。

第1、5、7和8節(jié)應(yīng)該是本書的良好補(bǔ)充。第4節(jié)可能用處不大,第6節(jié)如果再大一點(diǎn)就好了。如果你不是一個(gè)程序員,你可能無(wú)法使用第3節(jié),但是一旦你在本書中閱讀了更多關(guān)于系統(tǒng)調(diào)用的內(nèi)容,你可能就能理解第2節(jié)中的一些材料。

一些常見的術(shù)語(yǔ)有許多匹配的手冊(cè)頁(yè)面,跨越幾個(gè)章節(jié)。默認(rèn)情況下,man會(huì)顯示它找到的第一個(gè)頁(yè)面。你可以按章節(jié)選擇手冊(cè)頁(yè)面。例如,要閱讀/etc/passwd文件描述(而不是passwd命令),你可以在頁(yè)面名稱前插入章節(jié)號(hào),如:

$ man 5 passwd

手冊(cè)頁(yè)涵蓋了基本內(nèi)容,但還有很多方法可以獲得在線幫助(除了在互聯(lián)網(wǎng)上搜索之外)。如果你只是在尋找某個(gè)命令的某個(gè)選項(xiàng),可以嘗試在命令名稱后面輸入--help或-h(不同的命令有不同的選項(xiàng))。你可能會(huì)得到大量的信息(如ls --help的情況),也可能找到你要找的東西。

前段時(shí)間,GNU項(xiàng)目認(rèn)為它不太喜歡手冊(cè)頁(yè),于是轉(zhuǎn)而使用另一種叫做info(或texinfo)的格式。這種文檔通常比典型的手冊(cè)頁(yè)更深入,但它可能更復(fù)雜。要訪問(wèn)info手冊(cè),請(qǐng)使用info的命令名:

$ info command

如果你不喜歡info閱讀器,你可以把輸出發(fā)送到less(只需添加 | less)。

有些軟件包將它們的可用文檔傾倒在/usr/share/doc中,而不考慮在線手冊(cè)系統(tǒng),如man或info。如果你發(fā)現(xiàn)自己在搜索文檔,請(qǐng)查看你系統(tǒng)中的這個(gè)目錄--當(dāng)然,也可以在網(wǎng)上搜索。

2.14 Shell的輸入和輸出

現(xiàn)在你已經(jīng)熟悉了基本的Unix命令、文件和目錄,你準(zhǔn)備學(xué)習(xí)如何重定向標(biāo)準(zhǔn)輸入和輸出。讓我們從標(biāo)準(zhǔn)輸出開始。

要把命令的輸出發(fā)送到文件而不是終端,請(qǐng)使用>重定向字符:

$ command > file

如果文件不存在,shell就會(huì)創(chuàng)建它。如果文件存在,shell會(huì)先刪除(clobbers)原始文件。(有些shell有參數(shù)可以防止clobber。例如,你可以輸入set -C來(lái)避免bash中的clobbering)。

你可以用">>重定向 "的語(yǔ)法將輸出附加到文件中而不是覆蓋它:

$ command > > file

這是方便的方法,當(dāng)執(zhí)行相關(guān)的命令序列時(shí),可以將輸出收集在一個(gè)地方。

要把一個(gè)命令的標(biāo)準(zhǔn)輸出發(fā)送到另一個(gè)命令的標(biāo)準(zhǔn)輸入,可以使用管道字符(|)。要看這是如何工作的,請(qǐng)嘗試這兩條命令:

$ head /proc/cpuinfo$ head /proc/cpuinfo | tr a-z A-Z

你可以通過(guò)你想要的管道命令發(fā)送輸出,只需在每個(gè)額外的命令前添加一個(gè)管道。

2.14.1 標(biāo)準(zhǔn)錯(cuò)誤

偶爾,你可能會(huì)重定向標(biāo)準(zhǔn)輸出,但發(fā)現(xiàn)程序仍然會(huì)向終端打印一些東西。這被稱為標(biāo)準(zhǔn)錯(cuò)誤(stderr);它是額外的輸出流,用于診斷和調(diào)試。例如,這個(gè)命令產(chǎn)生了錯(cuò)誤:

$ ls /fffffffff > f

完成后,f應(yīng)該是空的,但你仍然在終端上看到以下作為標(biāo)準(zhǔn)錯(cuò)誤的錯(cuò)誤信息:

ls: cannot access /fffffffff: No such file or directory

如果你愿意,你可以重定向標(biāo)準(zhǔn)錯(cuò)誤。例如,要把標(biāo)準(zhǔn)輸出發(fā)送到f,把標(biāo)準(zhǔn)錯(cuò)誤發(fā)送到e,使用2>語(yǔ)法,像這樣:

$ ls /fffffffff > f 2 > e

數(shù)字2指定了shell所修改的流ID。流ID 1是標(biāo)準(zhǔn)輸出(默認(rèn)),而2是標(biāo)準(zhǔn)錯(cuò)誤。

你也可以用>&符號(hào)將標(biāo)準(zhǔn)錯(cuò)誤發(fā)送到與stdout相同的地方。例如,要把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都發(fā)送到名為f的文件中,請(qǐng)嘗試這個(gè)命令:

$ ls /fffffffff > f 2 >&1

2.14.2 標(biāo)準(zhǔn)輸入重定向

要將文件引導(dǎo)到程序的標(biāo)準(zhǔn)輸入,請(qǐng)使用<操作符:

$ head < /proc/cpuinfo

你偶爾會(huì)遇到需要這種重定向的程序,但由于大多數(shù)Unix命令都接受文件名作為參數(shù),這種情況并不常見。例如,前面的命令可以寫成head /proc/cpuinfo。

2.15 理解錯(cuò)誤信息

當(dāng)你在類似Unix的系統(tǒng)(如Linux)上遇到問(wèn)題時(shí),你必須閱讀錯(cuò)誤信息。與其他操作系統(tǒng)的信息不同,Unix的錯(cuò)誤通常準(zhǔn)確地告訴你出了什么問(wèn)題。

2.15.1 Unix錯(cuò)誤信息的剖析

大多數(shù)Unix程序產(chǎn)生和報(bào)告相同的基本錯(cuò)誤信息,但在任何兩個(gè)程序的輸出之間可能有細(xì)微的差別。這里有一個(gè)例子,你肯定會(huì)以某種形式遇到:

$ ls /dsafsdals: cannot access /dsafsda: No such file or directory

這條信息有三個(gè)組成部分:

程序名稱,ls。有些程序省略了這一識(shí)別信息,當(dāng)你編寫shell腳本時(shí),這可能會(huì)讓人感到厭煩,但這其實(shí)并不是什么大問(wèn)題。文件名,/dsafsda,這是一個(gè)更具體的信息。這個(gè)路徑有一個(gè)問(wèn)題。錯(cuò)誤No such file or directory表明文件名有問(wèn)題。

把它們放在一起,你會(huì)得到這樣的信息:“l(fā)s tried to open /dsafsda but couldn’t because it doesn’t exist.” 。這可能看起來(lái)很明顯,但當(dāng)你運(yùn)行包括不同名稱的錯(cuò)誤命令的shell腳本時(shí),這些信息會(huì)變得有點(diǎn)混亂。

在排除錯(cuò)誤時(shí),總是先解決第一個(gè)錯(cuò)誤。有些程序在報(bào)告一系列其他問(wèn)題之前,會(huì)報(bào)告它們不能做任何事情。例如,假設(shè)你運(yùn)行一個(gè)名為scumd的虛構(gòu)程序,你看到了這樣的錯(cuò)誤信息:

scumd: cannot access /etc/scumd/config: No such file or directory

在這之后是一大串其他錯(cuò)誤信息,看起來(lái)就像一場(chǎng)完全的災(zāi)難。不要讓那些其他錯(cuò)誤分散你的注意力。你可能只是需要?jiǎng)?chuàng)建/etc/scumd/config。

注意:不要把錯(cuò)誤信息和警告信息混淆。警告通常看起來(lái)像錯(cuò)誤,但它們包含警告這個(gè)詞。警告通常意味著有什么問(wèn)題,但程序還是會(huì)嘗試?yán)^續(xù)運(yùn)行。為了解決警告信息中指出的問(wèn)題,你可能必須找到一個(gè)進(jìn)程并在做其他事情之前殺死它。(你將在第2.16節(jié)中學(xué)習(xí)列出和殺死進(jìn)程的知識(shí))。

2.15.2 常見錯(cuò)誤

你在Unix程序中遇到的許多錯(cuò)誤是由文件和進(jìn)程出錯(cuò)引起的。其中有很多錯(cuò)誤直接來(lái)自于內(nèi)核系統(tǒng)調(diào)用遇到的情況,因此你可以通過(guò)觀察這些錯(cuò)誤了解內(nèi)核是如何將問(wèn)題反饋給進(jìn)程的。

No such file or directory

這是頭號(hào)錯(cuò)誤。你試圖訪問(wèn)不存在的文件。因?yàn)閁nix的文件I/O系統(tǒng)對(duì)文件和目錄沒有什么區(qū)別,這個(gè)錯(cuò)誤信息涵蓋了兩種情況。當(dāng)你試圖讀取不存在的文件時(shí),當(dāng)你試圖改變到不存在的目錄時(shí),當(dāng)你試圖寫到不存在的目錄中的文件時(shí),你都會(huì)得到它,等等。這種錯(cuò)誤也被稱為ENOENT,是 "Error NO ENTity "的簡(jiǎn)稱。

注意:如果你對(duì)系統(tǒng)調(diào)用感興趣,這通常是open()返回ENOENT的結(jié)果。關(guān)于它可能遇到的錯(cuò)誤的更多信息,請(qǐng)參見open(2)手冊(cè)頁(yè)。

File exists

在這種情況下,你可能試圖創(chuàng)建已經(jīng)存在的文件。當(dāng)你試圖創(chuàng)建與文件同名的目錄時(shí),這很常見。

Not a directory, Is a directory

當(dāng)你試圖把文件作為目錄,或把目錄作為文件時(shí),這些信息就會(huì)彈出來(lái)。例如:

$ touch a$ touch a/btouch: a/b: Not a directory

注意,這個(gè)錯(cuò)誤信息只適用于a/b的a部分。當(dāng)你遇到這個(gè)問(wèn)題時(shí),你可能需要稍微挖掘一下,找到被當(dāng)作目錄的路徑組件。

No space left on device

你沒有磁盤空間了。

Permission denied

當(dāng)你試圖讀取或?qū)懭氩辉试S訪問(wèn)的文件或目錄時(shí)(你的權(quán)限不足),你會(huì)得到這個(gè)錯(cuò)誤。當(dāng)你試圖執(zhí)行沒有設(shè)置執(zhí)行位的文件時(shí),也會(huì)顯示這個(gè)錯(cuò)誤(即使你可以讀取該文件)。你將在第2.17節(jié)中閱讀更多關(guān)于權(quán)限的內(nèi)容。

Operation not permitted

這通常發(fā)生在你試圖殺死不屬于你的進(jìn)程時(shí)。

Segmentation fault, Bus error

分段故障本質(zhì)上意味著編寫你剛剛運(yùn)行的程序的人在某個(gè)地方搞砸了。該程序試圖訪問(wèn)它不允許觸及的內(nèi)存的某個(gè)部分,而操作系統(tǒng)將其殺死。同樣,總線錯(cuò)誤意味著程序試圖以一種不應(yīng)該的方式訪問(wèn)一些內(nèi)存。當(dāng)你得到這些錯(cuò)誤之一時(shí),你可能是給了程序一些它不期望的輸入。在極少數(shù)情況下,可能是內(nèi)存硬件出現(xiàn)了故障。

2.16 列出和操縱進(jìn)程

回顧第一章,進(jìn)程是正在運(yùn)行的程序。系統(tǒng)中的每個(gè)進(jìn)程都有一個(gè)數(shù)字的進(jìn)程ID(PID)。為了快速列出正在運(yùn)行的進(jìn)程,只需在命令行上運(yùn)行ps。你應(yīng)該得到一個(gè)類似這樣的列表:

$ ps  PID TTY STAT TIME COMMAND  520 p0  S    0:00 -bash  545  ?  S    3:59 /usr/X11R6/bin/ctwm -W  548  ?  S    0:10 xclock -geometry -0-0 2159 pd  SW   0:00 /usr/bin/vi lib/addresses31956 p3  R    0:00 ps

這些字段如下:

PID 進(jìn)程的ID。TTY 進(jìn)程所運(yùn)行的終端設(shè)備。稍后會(huì)有更多關(guān)于這個(gè)的內(nèi)容。STAT 進(jìn)程的狀態(tài)--即進(jìn)程正在做什么,它的內(nèi)存在哪里。例如,S表示睡眠,R表示運(yùn)行。(參見ps(1)手冊(cè)中對(duì)所有符號(hào)的描述)。TIME 進(jìn)程到目前為止所使用的CPU時(shí)間,以分和秒為單位。換句話說(shuō),該進(jìn)程在處理器上運(yùn)行指令的總時(shí)間。請(qǐng)記住,由于進(jìn)程不是持續(xù)運(yùn)行的,這與進(jìn)程開始后的時(shí)間(或 "壁鐘時(shí)間")不同。COMMAND 這個(gè)看起來(lái)很明顯,是用來(lái)運(yùn)行程序的命令,但是要注意,進(jìn)程可以改變這個(gè)字段的原始值。此外,shell可以進(jìn)行g(shù)lob擴(kuò)展,這個(gè)字段將反映擴(kuò)展后的命令,而不是你在提示符下輸入的命令。

注意:PID對(duì)于系統(tǒng)上運(yùn)行的每個(gè)進(jìn)程都是唯一的。然而,在進(jìn)程終止后,內(nèi)核最終可以為一個(gè)新的進(jìn)程重新使用這個(gè)PID。

2.16.1 ps命令選項(xiàng)

ps命令有很多選項(xiàng)。為了使事情更加混亂,你可以用三種不同的方式指定選項(xiàng)--Unix、BSD和GNU。許多人認(rèn)為BSD風(fēng)格是最舒服的(也許是因?yàn)樗婕暗捷^少的輸入),所以這就是我們?cè)诒緯幸褂玫娘L(fēng)格。下面是一些最有用的選項(xiàng)組合:

ps x 顯示所有正在運(yùn)行的進(jìn)程。

ps ax 顯示系統(tǒng)中的所有進(jìn)程,而不僅僅是你自己的進(jìn)程。

ps u 包括更詳細(xì)的進(jìn)程信息。

ps w 顯示完整的命令名稱,而不僅僅是適合一行的內(nèi)容。

與其他程序一樣,你可以組合選項(xiàng),如ps aux和ps auxw。

要檢查特定的進(jìn)程,可以在ps命令的參數(shù)列表中添加其PID。例如,要檢查當(dāng)前的shell進(jìn)程,你可以使用ps u $$

(是一個(gè)shell變量,評(píng)估為當(dāng)前shell的PID)。你會(huì)在第8章中找到關(guān)于管理命令top和lsof的信息。這些命令對(duì)于定位進(jìn)程是很有用的,即使你在做系統(tǒng)維護(hù)以外的事情時(shí)也是如此。

2.16.2 進(jìn)程終止

要終止進(jìn)程,你可以用kill命令向它發(fā)送信號(hào)--從內(nèi)核向進(jìn)程發(fā)送的信息。在大多數(shù)情況下,你所需要做的就是這樣:

$ kill pid

有許多類型的信號(hào)。默認(rèn)的(上面使用的)是TERM,即終止。你可以通過(guò)給kill增個(gè)額外的選項(xiàng)來(lái)發(fā)送不同的信號(hào)。例如,要凍結(jié)進(jìn)程而不是終止它,可以使用STOP信號(hào):

$ kill -STOP pid

停止的進(jìn)程仍然在內(nèi)存中,準(zhǔn)備繼續(xù)它的工作。使用CONT信號(hào)來(lái)繼續(xù)運(yùn)行該進(jìn)程:

$ kill -CONT pid

注意:使用CTRL-C來(lái)終止正在當(dāng)前終端運(yùn)行的進(jìn)程,與使用kill來(lái)結(jié)束進(jìn)程的INT(中斷)信號(hào)是一樣的。

內(nèi)核在接收到信號(hào)時(shí)給大多數(shù)進(jìn)程一個(gè)機(jī)會(huì)來(lái)清理自己(通過(guò)信號(hào)處理機(jī)制)。然而,一些進(jìn)程可能會(huì)選擇非終結(jié)性的動(dòng)作來(lái)響應(yīng)信號(hào),在試圖處理信號(hào)的過(guò)程中陷入困境,或者干脆忽略它,所以你可能會(huì)發(fā)現(xiàn)進(jìn)程在你試圖終止它之后仍然運(yùn)行。如果發(fā)生這種情況,而你又確實(shí)需要?dú)⑺肋M(jìn)程,那么終止它的最粗暴的方法就是使用KILL信號(hào)。與其他信號(hào)不同,KILL不能被忽略;事實(shí)上,操作系統(tǒng)甚至不給進(jìn)程一個(gè)機(jī)會(huì)。內(nèi)核會(huì)直接終止該進(jìn)程,并將其從內(nèi)存中強(qiáng)行刪除。使用這種方法只是作為最后的手段。

你可能會(huì)看到其他用戶用kill輸入數(shù)字而不是名字--例如,kill -9而不是kill -KILL。這是因?yàn)閮?nèi)核使用數(shù)字來(lái)表示不同的信號(hào);如果你知道你想發(fā)送的信號(hào)的編號(hào),你可以這樣使用kill。運(yùn)行kill -l來(lái)獲得信號(hào)編號(hào)與名稱的映射。

2.16.3 作業(yè)控制

Shell支持作業(yè)控制,這是一種通過(guò)使用各種按鍵和命令向程序發(fā)送TSTP(類似于STOP)和CONT信號(hào)的方法。這允許你在你使用的程序之間暫停和切換。例如,你可以用CTRL-Z發(fā)送一個(gè)TSTP信號(hào),然后通過(guò)輸入fg(移至前臺(tái))或bg(移至后臺(tái);見下一節(jié))再次啟動(dòng)程序。但是,盡管它很有用,而且許多有經(jīng)驗(yàn)的用戶也有這樣的習(xí)慣,作業(yè)控制并不是必須的,而且對(duì)初學(xué)者來(lái)說(shuō)可能會(huì)感到困惑: 用戶經(jīng)常按CTRL-Z而不是CTRL-C,忘記了他們正在運(yùn)行的東西,最終導(dǎo)致許多進(jìn)程被中止。

注意:要查看你是否不小心暫停了當(dāng)前終端上的任何進(jìn)程,可以運(yùn)行jobs命令。

如果你想運(yùn)行多個(gè)程序,在單獨(dú)的終端窗口中運(yùn)行每個(gè)程序,把非交互式進(jìn)程放在后臺(tái)(如下一節(jié)所述),并學(xué)會(huì)使用screen和tmux工具。

2.16.4 背景進(jìn)程

通常,當(dāng)你從shell中運(yùn)行Unix命令時(shí),在程序執(zhí)行完畢之前,你不會(huì)再得到shell提示。然而,你可以將進(jìn)程從shell中分離出來(lái),用安培號(hào)(&)把它放在 "后臺(tái)";這樣你就會(huì)得到提示符。例如,如果你有需要用 gunzip 解壓的大文件(你會(huì)在第 2.18 節(jié)中看到這個(gè)),并且你想在它運(yùn)行時(shí)做一些其他的事情,可以運(yùn)行這樣的命令:

$ gunzip file.gz &

shell應(yīng)該通過(guò)打印新的后臺(tái)進(jìn)程的PID來(lái)響應(yīng),并且提示應(yīng)該立即返回,這樣你就可以繼續(xù)工作了。如果該進(jìn)程需要很長(zhǎng)的時(shí)間,它甚至可以在你注銷后繼續(xù)運(yùn)行,如果你必須運(yùn)行進(jìn)行大量數(shù)字計(jì)算的程序,這就特別方便了。如果進(jìn)程在你注銷或關(guān)閉終端窗口之前完成,shell通常會(huì)通知你,這取決于你的設(shè)置。

注意如果你正在遠(yuǎn)程訪問(wèn)一臺(tái)機(jī)器,并希望在你注銷時(shí)繼續(xù)運(yùn)行一個(gè)程序,你可能需要使用nohup命令;詳情請(qǐng)見其手冊(cè)頁(yè)。

bash shell和大多數(shù)全屏交互程序都支持CTRL-L來(lái)重繪整個(gè)屏幕。如果一個(gè)程序是從標(biāo)準(zhǔn)輸入中讀取的,CTRL-R通常會(huì)重繪當(dāng)前行,但在錯(cuò)誤的時(shí)間按錯(cuò)誤的順序會(huì)讓你處于比以前更糟糕的情況。例如,在bash提示符下輸入CTRL-R會(huì)使你進(jìn)入反向的isearch模式(按ESC退出)。

2.17 文件模式和權(quán)限

每個(gè)Unix文件都有一組權(quán)限,決定你是否可以讀取、寫入或運(yùn)行該文件。運(yùn)行l(wèi)s -l可以顯示這些權(quán)限。下面是這樣顯示的例子:

-rw-r-r-1 1 juser somegroup 7041 Mar 26 19:34 endnotes.html

文件的模式1表示該文件的權(quán)限和一些額外的信息。該模式有四個(gè)部分,如圖2-1所示。

圖2-1: 文件模式的各個(gè)

模式的第一個(gè)字符是文件類型。在這個(gè)位置上的破折號(hào)(-),如圖所示,表示一個(gè)普通的文件,意味著這個(gè)文件沒有什么特別之處;它只是二進(jìn)制或文本數(shù)據(jù)。這是迄今為止最常見的文件類型。目錄也很常見,在文件類型槽中用d表示。(第3.1節(jié)列出了其余的文件類型)。

文件模式的其余部分包含權(quán)限,分為三組:用戶、組和其他,按順序排列。例如,例子中的rw-字符是用戶權(quán)限,后面的r--字符是組的權(quán)限,最后的r--字符是其他權(quán)限。

每個(gè)權(quán)限集可以包含四種基本表示:

r表示文件是可讀的。

w表示該文件是可寫的。

x表示該文件是可執(zhí)行的(你可以把它作為一個(gè)程序運(yùn)行)。

表示 "無(wú)"(更確切地說(shuō),這組中的那個(gè)權(quán)限沒有被授予)。

用戶權(quán)限(第一組)與擁有該文件的用戶有關(guān)。在前面的例子中,那就是juser。第二組,組權(quán)限,是針對(duì)文件的組(本例中的somegroup)。該組中的任何用戶都可以利用這些權(quán)限。(使用groups命令查看你所在的組,更多信息見7.3.5節(jié))。

系統(tǒng)中的每個(gè)人都可以根據(jù)第三組權(quán)限,即其他權(quán)限進(jìn)行訪問(wèn),這些權(quán)限有時(shí)被稱為世界權(quán)限。

注意:每個(gè)讀、寫和執(zhí)行的權(quán)限槽有時(shí)被稱為一個(gè)權(quán)限位,因?yàn)椴僮飨到y(tǒng)中的底層表示是一系列的位。因此,你可能會(huì)聽到人們把部分權(quán)限稱為 "讀位"。

一些可執(zhí)行文件在用戶權(quán)限列表中有一個(gè)s,而不是x,這表明該可執(zhí)行文件是setuid,意味著當(dāng)你執(zhí)行該程序時(shí),它的運(yùn)行就好像文件所有者是用戶而不是你。許多程序利用這個(gè)setuid位,以root身份運(yùn)行,以獲得他們需要的權(quán)限來(lái)改變系統(tǒng)文件。比如passwd程序,它需要改變/etc/passwd文件。

2.17.1 修改權(quán)限

要改變一個(gè)文件或目錄的權(quán)限,可以使用chmod命令。首先,挑選你想改變的權(quán)限集,然后挑選要改變的位。例如,要給文件增加組(g)和世界(o,代表 "其他")閱讀(r)權(quán)限,你可以運(yùn)行這兩條命令:

$ chmod g+r file$ chmod o+r file

或者你可以一次完成:

$ chmod go+r file

要?jiǎng)h除這些權(quán)限,使用go-r而不是go+r。

注意:顯然,你不應(yīng)該讓文件成為世界可寫文件,因?yàn)檫@樣做會(huì)使你系統(tǒng)中的任何人都可以改變它們。但是,這是否也允許任何連接到互聯(lián)網(wǎng)的人改變它們呢?可能不會(huì),除非你的系統(tǒng)有一個(gè)網(wǎng)絡(luò)安全漏洞。在這種情況下,文件權(quán)限反正也幫不了你。

你有時(shí)可能會(huì)看到有人用數(shù)字來(lái)改變權(quán)限,例如:

$ chmod 644 file

這被稱為絕對(duì)改變,因?yàn)樗淮涡栽O(shè)置了所有權(quán)限位。要理解這一點(diǎn),你需要知道如何以八進(jìn)制形式表示權(quán)限位(每個(gè)數(shù)字代表以8為基數(shù)的數(shù)字,0到7,并對(duì)應(yīng)權(quán)限集)。參見chmod(1)手冊(cè)頁(yè)或info手冊(cè)了解更多。

如果你喜歡使用絕對(duì)模式,你其實(shí)不需要知道如何構(gòu)建這些模式;只要記住你最常使用的模式即可。表2-4列出了最常見的幾種模式。

表2-4:絕對(duì)權(quán)限模式

目錄也有權(quán)限。如果目錄是可讀的,你可以列出該目錄的內(nèi)容,但只有當(dāng)該目錄是可執(zhí)行的,你才能訪問(wèn)該目錄中的文件。在大多數(shù)情況下,你都需要這兩種權(quán)限;人們?cè)谠O(shè)置目錄的權(quán)限時(shí)常犯的錯(cuò)誤是,在使用絕對(duì)模式時(shí)不小心刪除了執(zhí)行權(quán)限。

最后,你可以用umask shell命令指定一組默認(rèn)的權(quán)限,它對(duì)你創(chuàng)建的任何新文件應(yīng)用一組預(yù)定義的權(quán)限。一般來(lái)說(shuō),如果你希望每個(gè)人都能看到你創(chuàng)建的所有文件和目錄,就使用umask 022,如果你不希望,就使用umask 077。如果你想使你所希望的權(quán)限掩碼適用于新的窗口和以后的會(huì)話,你需要把帶有所需模式的umask命令放在你的某個(gè)啟動(dòng)文件中,如第13章中所討論的。

2.17.2 使用符號(hào)鏈接

符號(hào)鏈接是指向另一個(gè)文件或目錄的文件,有效地創(chuàng)建了別名(像Windows中的快捷方式)。符號(hào)鏈接提供了對(duì)模糊的目錄路徑的快速訪問(wèn)。

在一個(gè)長(zhǎng)的目錄列表中,符號(hào)鏈接看起來(lái)像這樣(注意文件模式中的l是文件類型):

lrwxrwxrwx 1 ruser users  11 Feb 27 13:52  somedir - > /home/origdir

如果你試圖訪問(wèn)這個(gè)目錄中的somedir,系統(tǒng)會(huì)給你/home/origdir代替。符號(hào)鏈接只是指向其他名字的文件名。它們的名字和它們所指向的路徑不需要有任何意義。在前面的例子中,/home/origdir不需要存在。

事實(shí)上,如果/home/origdir不存在,任何訪問(wèn)somedir的程序都會(huì)報(bào)告somedir不存在(除了ls somedir,這個(gè)命令愚蠢地告訴你somedir就是somedir)。這可能是令人困惑的,因?yàn)槟憧梢钥吹矫麨閟omedir的東西就在你眼前。

這并不是符號(hào)鏈接可能令人困惑的唯一方式。另一個(gè)問(wèn)題是,你不能僅僅通過(guò)查看鏈接的名稱來(lái)確定鏈接目標(biāo)的特征;你必須跟蹤鏈接,看它是否指向一個(gè)文件或目錄。你的系統(tǒng)也可能有指向其他鏈接的鏈接,這被稱為鏈?zhǔn)椒?hào)鏈接,當(dāng)你試圖追蹤它們時(shí),可能是個(gè)麻煩。

要?jiǎng)?chuàng)建一個(gè)從target到linkname的符號(hào)鏈接,使用ln -s,如下所示:

$ ln -s target linkname

linkname參數(shù)是符號(hào)鏈接的名稱,target參數(shù)是鏈接指向的文件或目錄的路徑,而-s標(biāo)志則指定了符號(hào)鏈接(見后面的警告)。

當(dāng)制作符號(hào)鏈接時(shí),在運(yùn)行命令前要檢查兩次,因?yàn)橛袔追N情況可能出錯(cuò)。例如,如果你不小心顛倒了參數(shù)的順序(ln -s linkname target),如果linkname是已經(jīng)存在的目錄,你就會(huì)遇到一些麻煩。如果是這種情況(經(jīng)常如此),ln會(huì)在linkname內(nèi)創(chuàng)建一個(gè)名為target的鏈接,而且這個(gè)鏈接會(huì)指向自己,除非linkname是完整的路徑。如果你在創(chuàng)建一個(gè)目錄的符號(hào)鏈接時(shí)出了問(wèn)題,請(qǐng)檢查該目錄是否有錯(cuò)誤的符號(hào)鏈接并刪除它們。

當(dāng)你不知道它們的存在時(shí),符號(hào)鏈接也會(huì)引起頭疼。例如,你可以很容易地編輯你認(rèn)為是文件的副本,但實(shí)際上是原文件的一個(gè)符號(hào)鏈接。

警告:創(chuàng)建符號(hào)鏈接時(shí)不要忘記-s選項(xiàng)。沒有它,ln會(huì)創(chuàng)建硬鏈接,給文件增加真實(shí)的文件名。新的文件名具有舊文件名的狀態(tài);它直接指向(鏈接)文件數(shù)據(jù),而不是像符號(hào)鏈接那樣指向另一個(gè)文件名。硬鏈接可能比符號(hào)鏈接更令人困惑。除非你了解第4.6節(jié)的內(nèi)容,否則要避免使用它們。

有了所有這些關(guān)于符號(hào)鏈接的警告,你可能想知道為什么有人會(huì)想使用它們。事實(shí)證明,它們的缺陷大大超過(guò)了它們?yōu)榻M織文件所提供的力量,以及它們輕松修補(bǔ)小問(wèn)題的能力。一個(gè)常見的使用情況是,當(dāng)一個(gè)程序期望找到一個(gè)特定的文件或目錄,而這個(gè)文件或目錄已經(jīng)存在于你系統(tǒng)的其他地方。你不想做一個(gè)拷貝,如果你不能改變程序,你可以直接從它那里創(chuàng)建一個(gè)符號(hào)鏈接到實(shí)際的文件或目錄位置。

2.18 歸檔和壓縮文件

現(xiàn)在你已經(jīng)了解了文件、權(quán)限和可能的錯(cuò)誤,你需要掌握gzip和tar,這兩個(gè)常用的工具用于壓縮和捆綁文件和目錄。

2.18.1 gzip

gzip(GNU Zip)這個(gè)程序是目前標(biāo)準(zhǔn)的 Unix 壓縮程序之一。以.gz結(jié)尾的文件是GNU Zip壓縮文件。使用 gunzip file.gz 來(lái)解壓縮 .gz 并移除后綴;要再次壓縮該文件,使用 gzip file。

2.18.2 tar

與其他操作系統(tǒng)的 ZIP 程序不同,gzip 不創(chuàng)建文件的檔案;也就是說(shuō),它不把多個(gè)文件和目錄打包成文件。要?jiǎng)?chuàng)建歸檔文件,用tar代替:

$ tar cvf archive.tar file1 file2 ...

用tar創(chuàng)建的歸檔文件通常有.tar后綴(這是慣例,不是必須的)。例如,在前面的命令中,file1、file2等是你希望歸檔在.tar中的文件和目錄的名稱。 c標(biāo)志激活了創(chuàng)建模式。v和f標(biāo)志有更具體的作用。

v 標(biāo)志激活了粗略的診斷輸出,使 tar 在遇到文件和目錄時(shí)打印它們的名字。添加另一個(gè)v會(huì)使tar打印細(xì)節(jié),如文件大小和權(quán)限。如果你不想讓tar告訴你它在做什么,省略v標(biāo)志。

f標(biāo)志表示文件選項(xiàng)。命令行中f標(biāo)志后的下一個(gè)參數(shù)必須是供tar創(chuàng)建的歸檔文件(在前面的例子中,它是.tar)。你必須在任何時(shí)候都使用這個(gè)選項(xiàng),后面跟一個(gè)文件名,除非是磁帶機(jī)。要使用標(biāo)準(zhǔn)輸入或輸出,將文件名設(shè)為破折號(hào)(-)。

要用tar解壓.tar文件,使用x標(biāo)志:

$ tar xvf archive.tar

在這個(gè)命令中,x標(biāo)志使tar進(jìn)入提取(解包)模式。你可以通過(guò)在命令行末尾輸入各個(gè)部分的名稱來(lái)提取檔案的各個(gè)部分,但你必須知道它們的確切名稱。(要確定這一點(diǎn),請(qǐng)看接下來(lái)描述的內(nèi)容表模式)。

注意:當(dāng)使用提取模式時(shí),記住tar在提取內(nèi)容后不會(huì)刪除存檔的.tar文件。

在解壓之前,用內(nèi)容表模式檢查 .tar 文件的內(nèi)容通常是個(gè)好主意,使用 t 標(biāo)志而不是 x 標(biāo)志。這種模式會(huì)驗(yàn)證歸檔文件的基本完整性,并打印出里面所有文件的名稱。如果你不在解壓前測(cè)試歸檔文件,你可能最終會(huì)把一大堆亂七八糟的文件倒入當(dāng)前目錄,這可能真的很難清理。

當(dāng)你用t模式檢查歸檔文件時(shí),要確認(rèn)所有的文件都在合理的目錄結(jié)構(gòu)中;也就是說(shuō),歸檔文件中的所有文件路徑名都應(yīng)該以同一個(gè)目錄開始。如果你不確定,可以創(chuàng)建一個(gè)臨時(shí)目錄,換到這個(gè)目錄,然后再解壓。(如果歸檔文件沒有造成混亂,你總是可以使用mv * ...)。

當(dāng)解壓時(shí),考慮使用p選項(xiàng)來(lái)保留權(quán)限。在解壓縮模式下使用這個(gè)選項(xiàng),可以覆蓋你的umask,得到存檔中指定的確切權(quán)限。當(dāng)你以超級(jí)用戶身份工作時(shí),p選項(xiàng)是默認(rèn)的。如果你在以超級(jí)用戶身份解壓歸檔文件時(shí)遇到權(quán)限和所有權(quán)方面的問(wèn)題,請(qǐng)確保你一直等到命令終止并得到shell提示。盡管你可能只想解壓縮文件的一小部分,但tar必須運(yùn)行整個(gè)文件,你不能打斷這個(gè)過(guò)程,因?yàn)樗挥性跈z查了整個(gè)壓縮文件后才設(shè)置權(quán)限。

把本節(jié)中所有的tar選項(xiàng)和模式都記在腦子里。如果你有困難,做一些閃存卡。這可能聽起來(lái)像小學(xué)生,但避免這個(gè)命令的粗心錯(cuò)誤是非常重要的。

2.18.3 壓縮檔案(.tar.gz)

許多初學(xué)者發(fā)現(xiàn)檔案通常是壓縮的,文件名以.tar.gz結(jié)尾,這讓他們感到困惑。要解開壓縮檔案,要從右邊到左邊;先擺脫.gz,然后再擔(dān)心.tar。 例如,這兩個(gè)命令解壓和解開.tar.gz:

$ gunzip file.tar.gz$ tar xvf file.tar

剛開始的時(shí)候,一次做一個(gè)步驟就可以了,先運(yùn)行g(shù)unzip來(lái)解壓,然后運(yùn)行tar來(lái)驗(yàn)證和解包。要?jiǎng)?chuàng)建一個(gè)壓縮檔案,做相反的事情:先運(yùn)行tar,然后再運(yùn)行g(shù)zip。經(jīng)常這樣做,你很快就會(huì)記住歸檔和壓縮過(guò)程是如何進(jìn)行的。但是,即使你不經(jīng)常這樣做,你也可以看到所有的輸入會(huì)變得多么令人厭煩,你會(huì)開始尋找捷徑。現(xiàn)在讓我們來(lái)看看這些。

2.18.4 zcat

剛才的方法并不是在壓縮檔案中調(diào)用tar的最快或最有效的方法,它浪費(fèi)了磁盤空間和內(nèi)核I/O時(shí)間。更好的方法是將歸檔和壓縮功能與一個(gè)流水線結(jié)合起來(lái)。例如,這個(gè)命令流水線解壓.tar.gz:

$ zcat file.tar.gz | tar xvf -

zcat命令與gunzip -dc相同。-d選項(xiàng)解壓,-c選項(xiàng)將結(jié)果發(fā)送到標(biāo)準(zhǔn)輸出(在本例中,發(fā)送到tar命令)。

因?yàn)槭褂脄cat非常普遍,Linux中的tar版本有一個(gè)快捷方式。你可以用z作為選項(xiàng),在歸檔文件上自動(dòng)調(diào)用gzip;這對(duì)提取歸檔文件(用tar的x或t模式)和創(chuàng)建歸檔文件(用c)都有效。例如,用下面的方法來(lái)驗(yàn)證壓縮的存檔:

$ tar ztvf file.tar.gz$ tar zxvf file.tar.gz # 解壓

然而,試著記住,在使用這個(gè)快捷方式時(shí),你實(shí)際上是在執(zhí)行兩個(gè)步驟。

注意:.tgz文件和.tar.gz文件是一樣的。這個(gè)后綴是為了適應(yīng)FAT(基于MS-DOS)文件系統(tǒng)。

2.18.5 其他壓縮工具

還有兩個(gè)壓縮程序是xz和bzip2,其壓縮文件分別以.xz和.bz2結(jié)尾。雖然比gzip稍慢,但這些程序通常會(huì)將文本文件壓縮得更多一些。要使用的解壓程序是unxz和bunzip2,這兩個(gè)程序的選項(xiàng)與它們的gzip對(duì)應(yīng)程序足夠接近,你不需要學(xué)習(xí)任何新東西。

大多數(shù)Linux發(fā)行版都帶有與Windows系統(tǒng)上的ZIP檔案兼容的zip和unzip程序。它們適用于通常的.zip文件,以及以.exe結(jié)尾的自解壓檔案。但是,如果你遇到一個(gè)以.Z結(jié)尾的文件,你就發(fā)現(xiàn)了一個(gè)由壓縮程序創(chuàng)建的遺跡,它曾經(jīng)是Unix的標(biāo)準(zhǔn)。gunzip程序可以解壓這些文件,但gzip不會(huì)創(chuàng)建它們。

2.19 Linux目錄層次結(jié)構(gòu)要點(diǎn)

現(xiàn)在你知道了如何檢查文件、改變目錄和閱讀手冊(cè)頁(yè),你準(zhǔn)備開始探索你的系統(tǒng)文件和目錄。Linux目錄結(jié)構(gòu)的細(xì)節(jié)在文件系統(tǒng)層次標(biāo)準(zhǔn)或FHS(https://refspecs.linuxfoundation.org/fhs.shtml)中作了概述,但現(xiàn)在簡(jiǎn)要介紹一下就足夠了。

圖2-2提供了層次結(jié)構(gòu)的簡(jiǎn)化概覽,顯示了/、/usr和/var下的一些目錄。請(qǐng)注意,/usr下的目錄結(jié)構(gòu)包含一些與/相同的目錄名稱。

圖2-2:Linux目錄層次結(jié)構(gòu)

下面是根目錄中最重要的子目錄:

/bin 包含隨時(shí)可以運(yùn)行的程序(也稱為可執(zhí)行程序),包括大多數(shù)基本的Unix命令,如ls和cp。/bin中的大多數(shù)程序都是二進(jìn)制格式,由C語(yǔ)言編譯器創(chuàng)建,但有些是現(xiàn)代系統(tǒng)中的shell腳本。/dev 包含設(shè)備文件。你將在第3章中進(jìn)一步了解這些文件。/etc 這個(gè)核心系統(tǒng)配置目錄(發(fā)音為EHT-see)包含用戶密碼、啟動(dòng)、設(shè)備、網(wǎng)絡(luò)和其他設(shè)置文件。/home 存放普通用戶的家庭(個(gè)人)目錄。大多數(shù)Unix安裝都符合這個(gè)標(biāo)準(zhǔn)。/lib 是library的縮寫,這個(gè)目錄存放包含可執(zhí)行文件可以使用的代碼的庫(kù)文件。有兩種類型的庫(kù):靜態(tài)和共享。/lib目錄應(yīng)該只包含共享庫(kù),但其他lib目錄,如/usr/lib,包含這兩種類型以及其他輔助文件。(我們將在第15章詳細(xì)討論共享庫(kù))。/proc 通過(guò)一個(gè)可瀏覽的目錄和文件界面提供系統(tǒng)統(tǒng)計(jì)數(shù)據(jù)。Linux上的/proc子目錄結(jié)構(gòu)大部分是獨(dú)特的,但許多其他Unix變體也有類似的功能。/proc目錄包含了關(guān)于當(dāng)前運(yùn)行進(jìn)程的信息以及一些內(nèi)核參數(shù)。/run 包含系統(tǒng)特有的運(yùn)行數(shù)據(jù),包括某些進(jìn)程ID、套接字文件、狀態(tài)記錄,以及在許多情況下,系統(tǒng)日志。這是最近才添加到根目錄中的;在舊系統(tǒng)中,你可以在/var/run中找到它。在較新的系統(tǒng)中,/var/run是指向/run的符號(hào)鏈接。/sys 這個(gè)目錄與/proc類似,它提供了設(shè)備和系統(tǒng)接口。你將在第3章中閱讀更多關(guān)于/sys的內(nèi)容。/sbin 系統(tǒng)可執(zhí)行程序的地方。/sbin目錄中的程序與系統(tǒng)管理有關(guān),所以普通用戶通常不會(huì)在他們的命令路徑中設(shè)置/sbin組件。如果不以root身份運(yùn)行,這里的許多實(shí)用程序就無(wú)法工作。/tmp 是存放較小的、你不太關(guān)心的臨時(shí)文件的區(qū)域。任何用戶都可以讀取和寫入/tmp,但該用戶可能沒有權(quán)限訪問(wèn)其他用戶的文件。許多程序使用這個(gè)目錄作為工作區(qū)。如果某些東西非常重要,不要把它放在/tmp里,因?yàn)榇蠖鄶?shù)發(fā)行版在機(jī)器啟動(dòng)時(shí)都會(huì)清除/tmp,有些甚至?xí)ㄆ趧h除其舊文件。另外,不要讓/tmp被垃圾填滿,因?yàn)樗目臻g通常與一些重要的東西共享(例如,/的其他部分)。/usr 雖然讀作 "用戶",但這個(gè)子目錄沒有用戶文件。相反,它包含大的目錄層次,包括Linux系統(tǒng)的大部分內(nèi)容。/usr中的許多目錄名稱與根目錄中的目錄名稱相同(如/usr/bin和/usr/lib),而且它們保存著相同類型的文件。(根目錄不包含完整的系統(tǒng)的原因主要是歷史原因--在過(guò)去,這是為了保持根目錄的低空間要求)。/var 變量子目錄,程序在這里記錄可能隨時(shí)間變化的信息。系統(tǒng)日志、用戶跟蹤、緩存和其他系統(tǒng)程序創(chuàng)建和管理的文件都在這里。(你會(huì)注意到這里有一個(gè)/var/tmp目錄,但系統(tǒng)在啟動(dòng)時(shí)并不擦除它)。

2.19.1 其他根子目錄

在根目錄下還有一些其他有趣的子目錄:

/boot 包含內(nèi)核啟動(dòng)加載器文件。這些文件只與Linux啟動(dòng)程序的第一階段有關(guān),所以你不會(huì)在這個(gè)目錄中找到關(guān)于Linux如何啟動(dòng)其服務(wù)的信息。關(guān)于這一點(diǎn),請(qǐng)看第5章。/media 許多發(fā)行版中都有可移動(dòng)媒體(如閃存驅(qū)動(dòng)器)的基本連接點(diǎn)。/opt 這可能包含額外的第三方軟件。許多系統(tǒng)不使用/opt。

2.19.2 /usr目錄

乍一看,/usr目錄可能看起來(lái)比較干凈,但快速瀏覽一下/usr/bin和/usr/lib就會(huì)發(fā)現(xiàn)這里有很多東西;/usr是大多數(shù)用戶空間程序和數(shù)據(jù)所在的地方。除了/usr/bin、/usr/sbin和/usr/lib之外,/usr還包括以下內(nèi)容:

/include 存放C語(yǔ)言編譯器使用的頭文件。/local 是管理員可以安裝自己的軟件的地方。它的結(jié)構(gòu)應(yīng)該與/和/usr的結(jié)構(gòu)相似。/man 包含手冊(cè)頁(yè)面。/share 包含的文件應(yīng)該可以在其他類型的Unix機(jī)器上使用而不損失功能。這些通常是程序和庫(kù)在必要時(shí)讀取的輔助數(shù)據(jù)文件。在過(guò)去,機(jī)器網(wǎng)絡(luò)會(huì)從文件服務(wù)器上共享這個(gè)目錄,但今天以這種方式使用的共享目錄已經(jīng)很少了,因?yàn)樵诋?dāng)代系統(tǒng)上對(duì)這些類型的文件沒有實(shí)際的空間限制。相反,在Linux發(fā)行版上,你會(huì)發(fā)現(xiàn)/man、/info和其他許多子目錄在這里,因?yàn)檫@是容易理解的慣例。

2.19.3 內(nèi)核位置

在Linux系統(tǒng)中,內(nèi)核通常是二進(jìn)制文件/vmlinuz或者/boot/vmlinuz。引導(dǎo)加載器將這個(gè)文件加載到內(nèi)存中,并在系統(tǒng)啟動(dòng)時(shí)將其啟動(dòng)。(你會(huì)在第5章中找到關(guān)于引導(dǎo)裝載器的細(xì)節(jié))。

一旦 Boot Loader 啟動(dòng)了內(nèi)核,主內(nèi)核文件就不再被運(yùn)行中的系統(tǒng)使用。然而,你會(huì)發(fā)現(xiàn)在正常的系統(tǒng)運(yùn)行過(guò)程中,內(nèi)核會(huì)根據(jù)需要加載和卸載許多模塊。它們被稱為可加載的內(nèi)核模塊,位于/lib/modules下。

2.20 以超級(jí)用戶身份運(yùn)行命令

在進(jìn)一步研究之前,你應(yīng)該學(xué)習(xí)如何以超級(jí)用戶身份運(yùn)行命令。你可能很想啟動(dòng)root shell,但是這樣做有很多缺點(diǎn):

沒有改變系統(tǒng)的命令的記錄。沒有執(zhí)行改變系統(tǒng)的命令的用戶的記錄。不能訪問(wèn)你的正常shell環(huán)境。必須輸入root密碼(如果你有的話)。

2.20.1 sudo

大多數(shù)發(fā)行版使用一個(gè)叫做sudo的軟件包,允許管理員在以自己身份登錄時(shí)以root身份運(yùn)行命令。例如,在第7章中,你將學(xué)習(xí)如何使用vipw來(lái)編輯/etc/passwd文件。你可以這樣做:

$ sudo vipw

當(dāng)你運(yùn)行這個(gè)命令時(shí),sudo會(huì)在local2設(shè)施下的syslog服務(wù)中記錄這個(gè)動(dòng)作。你還將在第7章中學(xué)習(xí)更多關(guān)于系統(tǒng)日志的知識(shí)。

2.20.2 /etc/sudoers

當(dāng)然,系統(tǒng)不會(huì)讓任何用戶作為超級(jí)用戶運(yùn)行命令;你必須在/etc/sudoers文件中配置特權(quán)用戶。sudo軟件包有許多選項(xiàng)(你可能永遠(yuǎn)不會(huì)用到),這使得/etc/sudoers中的語(yǔ)法有些復(fù)雜。例如,這個(gè)文件賦予用戶1和用戶2以root身份運(yùn)行任何命令的權(quán)力,而不需要輸入密碼:

User_Alias ADMINS = user1, user2ADMINS ALL = NOPASSWD: ALLroot ALL=(ALL) ALL

第一行定義了有兩個(gè)用戶的ADMINS用戶別名,第二行授予權(quán)限。ALL = NOPASSWD: ALL部分意味著ADMINS別名中的用戶可以使用sudo來(lái)作為root執(zhí)行命令。第二個(gè)ALL表示 "任何命令"。第一個(gè)ALL的意思是 "任何主機(jī)"。(如果你有不止一臺(tái)機(jī)器,你可以為每臺(tái)機(jī)器或每組機(jī)器設(shè)置不同的訪問(wèn)權(quán)限,但我們不會(huì)介紹這個(gè)功能)。

root ALL=(ALL) ALL僅僅意味著超級(jí)用戶也可以使用sudo來(lái)運(yùn)行任何主機(jī)上的任何命令。額外的(ALL)意味著超級(jí)用戶也可以作為任何其他用戶運(yùn)行命令。你可以通過(guò)在第二行/etc/sudoers中加入(ALL),將這個(gè)權(quán)限擴(kuò)展到ADMINS用戶,如圖所示:

ADMINS ALL = (ALL) NOPASSWD: ALL

注意:使用visudo命令來(lái)編輯/etc/sudoers。該命令在你保存文件后檢查文件的語(yǔ)法錯(cuò)誤。

2.20.3 sudo日志

盡管我們將在本書后面更詳細(xì)地討論日志,但你可以用這個(gè)命令在大多數(shù)系統(tǒng)上找到sudo日志:

$ journalctl SYSLOG_IDENTIFIER=sudo

在舊系統(tǒng)上,你需要在/var/log中尋找日志文件,例如/var/log/auth.log。

這就是目前sudo的情況。如果你需要使用它更多的高級(jí)功能,請(qǐng)參閱sudoers(5)和sudo(8)手冊(cè)。(用戶切換的實(shí)際機(jī)制將在第7章中介紹)。

2.21 展望未來(lái)

你現(xiàn)在應(yīng)該知道如何在命令行上做以下事情:運(yùn)行程序、重定向輸出、與文件和目錄交互、查看進(jìn)程列表、查看手冊(cè)頁(yè)面,以及通常在Linux系統(tǒng)的用戶空間中進(jìn)行操作。你還應(yīng)該能夠以超級(jí)用戶的身份運(yùn)行命令。你可能還不太了解用戶空間組件的內(nèi)部細(xì)節(jié)或內(nèi)核中發(fā)生的事情,但隨著文件和進(jìn)程的基礎(chǔ)知識(shí)的掌握,你已經(jīng)在路上了。在接下來(lái)的幾章中,你將使用剛剛學(xué)到的命令行工具來(lái)處理內(nèi)核和用戶空間的系統(tǒng)組件。

標(biāo)簽:

上一篇:【天天時(shí)快訊】快速介紹8種常用數(shù)據(jù)結(jié)構(gòu)
下一篇:最后一頁(yè)