在這之前,我們已經(jīng)知道了一系列神秘的命令,每個(gè)命令都有自己奇妙的 選項(xiàng)和參數(shù)。在這一章中,我們將試圖去掉一些神秘性,甚至創(chuàng)建我們自己 的命令。這一章將介紹以下命令:
type – 說明怎樣解釋一個(gè)命令名
which – 顯示會(huì)執(zhí)行哪個(gè)可執(zhí)行程序
man – 顯示命令手冊頁
apropos – 顯示一系列適合的命令
info – 顯示命令 info
whatis – 顯示一個(gè)命令的簡潔描述
命令可以是下面四種形式之一:
是一個(gè)可執(zhí)行程序,就像我們所看到的位于目錄/usr/bin 中的文件一樣。 屬于這一類的程序,可以編譯成二進(jìn)制文件,諸如用 C 和 C++語言寫成的程序, 也可以是由腳本語言寫成的程序,比如說 shell,perl,python,ruby,等等。
是一個(gè)內(nèi)建于 shell 自身的命令。bash 支持若干命令,內(nèi)部叫做 shell 內(nèi)部命令 (builtins)。例如,cd 命令,就是一個(gè) shell 內(nèi)部命令。
是一個(gè) shell 函數(shù)。這些是小規(guī)模的 shell 腳本,它們混合到環(huán)境變量中。 在后續(xù)的章節(jié)里,我們將討論配置環(huán)境變量以及書寫 shell 函數(shù)。但是現(xiàn)在, 僅僅意識(shí)到它們的存在就可以了。
這經(jīng)常很有用,能確切地知道正在使用四類命令中的哪一類。Linux 提供了一對方法來 弄明白命令類型。
type 命令是 shell 內(nèi)部命令,它會(huì)顯示命令的類別,給出一個(gè)特定的命令名(做為參數(shù))。 它像這樣工作:
type command
"command"是你要檢測的命令名。這里有些例子:
[me@linuxbox ~]$ type type
type is a shell builtins
[me@linuxbox ~]$ type ls
ls is aliased to `ls --color=tty`
[me@linuxbox ~]$ type cp
cp is /bin/cp
我們看到這三個(gè)不同命令的檢測結(jié)果。注意,ls 命令(在 Fedora 系統(tǒng)中)的檢查結(jié)果,ls 命令實(shí)際上 是 ls 命令加上選項(xiàng)"--color=tty"的別名。現(xiàn)在我們知道為什么 ls 的輸出結(jié)果是有顏色的!
有時(shí)候在一個(gè)操作系統(tǒng)中,不只安裝了可執(zhí)行程序的一個(gè)版本。然而在桌面系統(tǒng)中,這并不普遍, 但在大型服務(wù)器中,卻很平常。為了確定所給定的執(zhí)行程序的準(zhǔn)確位置,使用 which 命令:
[me@linuxbox ~]$ which ls
/bin/ls
這個(gè)命令只對可執(zhí)行程序有效,不包括內(nèi)部命令和命令別名,別名是真正的可執(zhí)行程序的替代物。 當(dāng)我們試著使用 shell 內(nèi)部命令時(shí),例如,cd 命令,我們或者得不到回應(yīng),或者是個(gè)錯(cuò)誤信息:
[me@linuxbox ~]$ which cd
/usr/bin/which: no cd in
(/opt/jre1.6.0_03/bin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/opt/jre1
.6.0_03/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/home/me/bin)
說“命令沒有找到”,真是很奇特。
知道了什么是命令,現(xiàn)在我們來尋找每一類命令的可得到的文檔。
bash 有一個(gè)內(nèi)建的幫助工具,可供每一個(gè) shell 內(nèi)部命令使用。輸入“help”,接著是 shell 內(nèi)部命令名。例如:
[me@linuxbox ~]$ help cd
cd: cd [-L|-P] [dir]
Change ...
注意表示法:出現(xiàn)在命令語法說明中的方括號(hào),表示可選的項(xiàng)目。一個(gè)豎杠字符 表示互斥選項(xiàng)。在上面 cd 命令的例子中:
cd [-L|-P] [dir]
這種表示法說明,cd 命令可能有一個(gè)“-L”選項(xiàng)或者“-P”選項(xiàng),進(jìn)一步,可能有參數(shù)“dir”。
雖然 cd 命令的幫助文檔很簡潔準(zhǔn)確,但它決不是教材。正如我們所看到的,它似乎提到了許多 我們還沒有談?wù)摰降臇|西!不要擔(dān)心,我們會(huì)學(xué)到的。
許多可執(zhí)行程序支持一個(gè) --help 選項(xiàng),這個(gè)選項(xiàng)是顯示命令所支持的語法和選項(xiàng)說明。例如:
[me@linuxbox ~]$ mkdir --help
Usage: mkdir [OPTION] DIRECTORY...
Create ...
一些程序不支持 --help 選項(xiàng),但不管怎樣試一下。這經(jīng)常會(huì)導(dǎo)致輸出錯(cuò)誤信息,但同時(shí)能 揭示一樣的命令用法信息。
許多希望被命令行使用的可執(zhí)行程序,提供了一個(gè)正式的文檔,叫做手冊或手冊頁(man page)。一個(gè)特殊的叫做 man 的分頁程序,可用來瀏覽他們。它是這樣使用的:
man program
“program”是要瀏覽的命令名。
手冊文檔的格式有點(diǎn)不同,一般地包含一個(gè)標(biāo)題,命令語法的綱要,命令用途的說明, 和命令選項(xiàng)列表,及每個(gè)選項(xiàng)的說明。然而,通常手冊文檔并不包含實(shí)例,它打算 作為一本參考手冊,而不是教材。作為一個(gè)例子,瀏覽一下 ls 命令的手冊文檔:
[me@linuxbox ~]$ man ls
在大多數(shù) Linux 系統(tǒng)中,man 使用 less 工具來顯示參考手冊,所以當(dāng)瀏覽文檔時(shí),你所熟悉的 less 命令都能有效。
man 所顯示的參考手冊,被分成幾個(gè)章節(jié),它們不僅僅包括用戶命令,也包括系統(tǒng)管理員 命令,程序接口,文件格式等等。下表描繪了手冊的布局:
章節(jié) | 內(nèi)容 |
---|---|
1 | 用戶命令 |
2 | 程序接口內(nèi)核系統(tǒng)調(diào)用 |
3 | C 庫函數(shù)程序接口 |
4 | 特殊文件,比如說設(shè)備結(jié)點(diǎn)和驅(qū)動(dòng)程序 |
5 | 文件格式 |
6 | 游戲娛樂,如屏幕保護(hù)程序 |
7 | 其他方面 |
8 | 系統(tǒng)管理員命令 |
有時(shí)候,我們需要查看參考手冊的特定章節(jié),從而找到我們需要的信息。 如果我們要查找一種文件格式,而同時(shí)它也是一個(gè)命令名時(shí),這種情況尤其正確。 沒有指定章節(jié)號(hào),我們總是得到第一個(gè)匹配項(xiàng),可能在第一章節(jié)。我們這樣使用 man 命令, 來指定章節(jié)號(hào):
man section search_term
例如:
[me@linuxbox ~]$ man 5 passwd
命令運(yùn)行結(jié)果會(huì)顯示文件 /etc/passwd 的文件格式說明手冊。
也有可能搜索參考手冊列表,基于某個(gè)關(guān)鍵字的匹配項(xiàng)。雖然很粗糙但有時(shí)很有用。 下面是一個(gè)以"floppy"為關(guān)鍵詞來搜索參考手冊的例子:
[me@linuxbox ~]$ apropos floppy
create_floppy_devices (8) - udev callout to create all possible
...
輸出結(jié)果每行的第一個(gè)字段是手冊頁的名字,第二個(gè)字段展示章節(jié)。注意,man 命令加上"-k"選項(xiàng), 和 apropos 完成一樣的功能。
whatis 程序顯示匹配特定關(guān)鍵字的手冊頁的名字和一行命令說明:
最晦澀難懂的手冊頁
正如我們所看到的,Linux 和類 Unix 的系統(tǒng)提供的手冊頁,只是打算作為參考手冊使用, 而不是教材。許多手冊頁都很難閱讀,但是我認(rèn)為由于閱讀難度而能拿到特等獎(jiǎng)的手冊頁應(yīng)該是 bash 手冊頁。因?yàn)槲艺跒檫@本書做我的研究,所以我很仔細(xì)地瀏覽了整個(gè) bash 手冊,為的是確保我講述了 大部分的 bash 主題。當(dāng)把 bash 參考手冊整個(gè)打印出來,其篇幅有八十多頁且內(nèi)容極其緊密, 但對于初學(xué)者來說,其結(jié)構(gòu)安排毫無意義。
另一方面,bash 參考手冊的內(nèi)容非常簡明精確,同時(shí)也非常完善。所以,如果你有膽量就查看一下, 并且期望有一天你能讀懂它。
GNU 項(xiàng)目提供了一個(gè)命令程序手冊頁的替代物,稱為"info"。info 內(nèi)容可通過 info 閱讀器 程序讀取。info 頁是超級鏈接形式的,和網(wǎng)頁很相似。這有個(gè)例子:
File: coreutils.info, Node: ls invocation, Next: dir invocation,
Up: Directory listing
10.1 `ls': List directory contents
==================================
...
info 程序讀取 info 文件,info 文件是樹型結(jié)構(gòu),分化為各個(gè)結(jié)點(diǎn),每一個(gè)包含一個(gè)題目。 info 文件包含超級鏈接,它可以讓你從一個(gè)結(jié)點(diǎn)跳到另一個(gè)結(jié)點(diǎn)。一個(gè)超級鏈接可通過 它開頭的星號(hào)來辨別出來,把光標(biāo)放在它上面并按下 enter 鍵,就可以激活它。
輸入"info",接著輸入程序名稱,啟動(dòng) info。下表中的命令,當(dāng)顯示一個(gè) info 頁面時(shí), 用來控制閱讀器。
命令 | 行為 |
---|---|
? | 顯示命令幫助 |
PgUp or Backspace | 顯示上一頁 |
PgDn or Space | 顯示下一頁 |
n | 下一個(gè) - 顯示下一個(gè)結(jié)點(diǎn) |
p | 上一個(gè) - 顯示上一個(gè)結(jié)點(diǎn) |
u | Up - 顯示當(dāng)前所顯示結(jié)點(diǎn)的父結(jié)點(diǎn),通常是個(gè)菜單 |
Enter | 激活光標(biāo)位置下的超級鏈接 |
q | 退出 |
到目前為止,我們所討論的大多數(shù)命令行程序,屬于 GNU 項(xiàng)目"coreutils"包,所以輸入:
[me@linuxbox ~]$ info coreutils
將會(huì)顯示一個(gè)包含超級鏈接的手冊頁,這些超級鏈接指向包含在 coreutils 包中的各個(gè)程序。
許多安裝在你系統(tǒng)中的軟件,都有自己的文檔文件,這些文件位于/usr/share/doc 目錄下。 這些文件大多數(shù)是以文本文件的形式存儲(chǔ)的,可用 less 閱讀器來瀏覽。一些文件是 HTML 格式, 可用網(wǎng)頁瀏覽器來閱讀。我們可能遇到許多以".gz"結(jié)尾的文件。這表示 gzip 壓縮程序 已經(jīng)壓縮了這些程序。gzip 軟件包包括一個(gè)特殊的 less 版本,叫做 zless,zless 可以顯示由 gzip 壓縮的文本文件的內(nèi)容。
現(xiàn)在是時(shí)候,感受第一次編程經(jīng)歷了!我們將用 alias 命令創(chuàng)建我們自己的命令。但在 開始之前,我們需要展示一個(gè)命令行小技巧??梢园讯鄠€(gè)命令放在同一行上,命令之間 用";"分開。它像這樣工作:
command1; command2; command3...
我們會(huì)用到下面的例子:
[me@linuxbox ~]$ cd /usr; ls; cd -
bin games kerberos lib64 local share tmp
...
[me@linuxbox ~]$
正如我們看到的,我們在一行上聯(lián)合了三個(gè)命令。首先更改目錄到/usr,然后列出目錄 內(nèi)容,最后回到原始目錄(用命令"cd ~"),結(jié)束在開始的地方。現(xiàn)在,通過 alia 命令 把這一串命令轉(zhuǎn)變?yōu)橐粋€(gè)命令。我們要做的第一件事就是為我們的新命令構(gòu)想一個(gè)名字。 比方說"test"。在使用"test"之前,查明是否"test"命令名已經(jīng)存在系統(tǒng)中,是個(gè)很不錯(cuò) 的主意。為了查清此事,可以使用 type 命令:
[me@linuxbox ~]$ type test
test is a shell builtin
哦!"test"名字已經(jīng)被使用了。試一下"foo":
[me@linuxbox ~]$ type foo
bash: type: foo: not found
太棒了!"foo"還沒被占用。創(chuàng)建命令別名:
[me@linuxbox ~]$ alias foo='cd /usr; ls; cd -'
注意命令結(jié)構(gòu):
alias name='string'
在命令"alias"之后,輸入“name”,緊接著(沒有空格)是一個(gè)等號(hào),等號(hào)之后是 一串用引號(hào)引起的字符串,字符串的內(nèi)容要賦值給 name。我們定義了別名之后, 這個(gè)命令別名可以使用在任何地方。試一下:
[me@linuxbox ~]$ foo
bin games kerberos lib64 local share tmp
...
[me@linuxbox ~]$
我們也可以使用 type 命令來查看我們的別名:
[me@linuxbox ~]$ type foo
foo is aliased to `cd /usr; ls ; cd -'
刪除別名,使用 unalias 命令,像這樣:
[me@linuxbox ~]$ unalias foo
[me@linuxbox ~]$ type foo
bash: type: foo: not found
雖然我們有意避免使用已經(jīng)存在的命令名來命名我們的別名,但這是常做的事情。通常, 會(huì)把一個(gè)普遍用到的選項(xiàng)加到一個(gè)經(jīng)常使用的命令后面。例如,之前見到的 ls 命令,會(huì) 帶有色彩支持:
[me@linuxbox ~]$ type ls
ls is aliased to 'ls --color=tty'
要查看所有定義在系統(tǒng)環(huán)境中的別名,使用不帶參數(shù)的 alias 命令。下面在 Fedora 系統(tǒng)中 默認(rèn)定義的別名。試著弄明白,它們是做什么的:
[me@linuxbox ~]$ alias
alias l.='ls -d .* --color=tty'
...
在命令行中定義別名有點(diǎn)兒小問題。當(dāng)你的 shell 會(huì)話結(jié)束時(shí),它們會(huì)消失。隨后的章節(jié)里, 我們會(huì)了解怎樣把自己的別名添加到文件中去,每次我們登錄系統(tǒng),這些文件會(huì)建立系統(tǒng)環(huán)境。 現(xiàn)在,好好享受我們剛經(jīng)歷過的,步入 shell 編程世界的第一步吧,雖然微小。
既然我們已經(jīng)學(xué)習(xí)了怎樣找到命令的幫助文檔,那就試著查閱,到目前為止,我們學(xué)到的所有 命令的文檔。學(xué)習(xí)命令其它可用的選項(xiàng),練習(xí)一下!
在網(wǎng)上,有許多關(guān)于 Linux 和命令行的文檔。以下是一些最好的文檔:
Bash 參考手冊是一本 bash shell 的參考指南。它仍然是一本參考書,但是包含了很多 實(shí)例,而且它比 bash 手冊頁容易閱讀。
Bash FAQ 包含關(guān)于 bash,而經(jīng)常提到的問題的答案。這個(gè)列表面向 bash 的中高級用戶, 但它包含了許多有幫助的信息。
GUN 項(xiàng)目為它的程序提供了大量的文檔,這些文檔組成了 Linux 命令行實(shí)驗(yàn)的核心。 這里你可以看到一個(gè)完整的列表:
Wikipedia 有一篇關(guān)于手冊頁的有趣文章: