鍍金池/ 教程/ Linux/ 使用命令
網(wǎng)絡(luò)系統(tǒng)
打印
重定向
使用命令
位置參數(shù)
權(quán)限
文本處理
疑難排解
layout: book-zh title: 自定制 shell 提示符
查找文件
layout: book-zh title: vi 簡介
shell 環(huán)境
什么是 shell
編譯程序
鍵盤高級操作技巧
流程控制:case 分支
流程控制:if 分支結(jié)構(gòu)
layout: book-zh title: 軟件包管理
進(jìn)程
存儲(chǔ)媒介
格式化輸出
編寫第一個(gè) Shell 腳本
啟動(dòng)一個(gè)項(xiàng)目
流程控制:while/until 循環(huán)
文件系統(tǒng)中跳轉(zhuǎn)
字符串和數(shù)字
讀取鍵盤輸入
歸檔和備份
探究操作系統(tǒng)
流程控制:for 循環(huán)
自頂向下設(shè)計(jì)
數(shù)組
操作文件和目錄
奇珍異寶
從 shell 眼中看世界
正則表達(dá)式

使用命令

在這之前,我們已經(jīng)知道了一系列神秘的命令,每個(gè)命令都有自己奇妙的 選項(xiàng)和參數(shù)。在這一章中,我們將試圖去掉一些神秘性,甚至創(chuàng)建我們自己 的命令。這一章將介紹以下命令:

  • type – 說明怎樣解釋一個(gè)命令名

  • which – 顯示會(huì)執(zhí)行哪個(gè)可執(zhí)行程序

  • man – 顯示命令手冊頁

  • apropos – 顯示一系列適合的命令

  • info – 顯示命令 info

  • whatis – 顯示一個(gè)命令的簡潔描述

  • alias – 創(chuàng)建命令別名

到底什么是命令?

命令可以是下面四種形式之一:

  1. 是一個(gè)可執(zhí)行程序,就像我們所看到的位于目錄/usr/bin 中的文件一樣。 屬于這一類的程序,可以編譯成二進(jìn)制文件,諸如用 C 和 C++語言寫成的程序, 也可以是由腳本語言寫成的程序,比如說 shell,perl,python,ruby,等等。

  2. 是一個(gè)內(nèi)建于 shell 自身的命令。bash 支持若干命令,內(nèi)部叫做 shell 內(nèi)部命令 (builtins)。例如,cd 命令,就是一個(gè) shell 內(nèi)部命令。

  3. 是一個(gè) shell 函數(shù)。這些是小規(guī)模的 shell 腳本,它們混合到環(huán)境變量中。 在后續(xù)的章節(jié)里,我們將討論配置環(huán)境變量以及書寫 shell 函數(shù)。但是現(xiàn)在, 僅僅意識(shí)到它們的存在就可以了。

  4. 是一個(gè)命令別名。我們可以定義自己的命令,建立在其它命令之上。

識(shí)別命令

這經(jīng)常很有用,能確切地知道正在使用四類命令中的哪一類。Linux 提供了一對方法來 弄明白命令類型。

type - 顯示命令的類型

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é)果是有顏色的!

which - 顯示一個(gè)可執(zhí)行程序的位置

有時(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)在我們來尋找每一類命令的可得到的文檔。

help - 得到 shell 內(nèi)部命令的幫助文檔

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é)到的。

--help - 顯示用法信息

許多可執(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í)能 揭示一樣的命令用法信息。

man - 顯示程序手冊頁

許多希望被命令行使用的可執(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)管理員 命令,程序接口,文件格式等等。下表描繪了手冊的布局:

表6-1: 手冊頁的組織形式
章節(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 的文件格式說明手冊。

apropos - 顯示適當(dāng)?shù)拿?/h2>

也有可能搜索參考手冊列表,基于某個(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 - 顯示非常簡潔的命令說明

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í)也非常完善。所以,如果你有膽量就查看一下, 并且期望有一天你能讀懂它。

info - 顯示程序 Info 條目

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í), 用來控制閱讀器。

表 6-2: info 命令
命令 行為
? 顯示命令幫助
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è)程序。

README 和其它程序文檔

許多安裝在你系統(tǒng)中的軟件,都有自己的文檔文件,這些文件位于/usr/share/doc 目錄下。 這些文件大多數(shù)是以文本文件的形式存儲(chǔ)的,可用 less 閱讀器來瀏覽。一些文件是 HTML 格式, 可用網(wǎng)頁瀏覽器來閱讀。我們可能遇到許多以".gz"結(jié)尾的文件。這表示 gzip 壓縮程序 已經(jīng)壓縮了這些程序。gzip 軟件包包括一個(gè)特殊的 less 版本,叫做 zless,zless 可以顯示由 gzip 壓縮的文本文件的內(nèi)容。

用別名(alias)創(chuàng)建你自己的命令

現(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 手冊頁容易閱讀。

    http://www.gnu.org/software/bash/manual/bashref.html

  • Bash FAQ 包含關(guān)于 bash,而經(jīng)常提到的問題的答案。這個(gè)列表面向 bash 的中高級用戶, 但它包含了許多有幫助的信息。

    http://mywiki.wooledge.org/BashFAQ

  • GUN 項(xiàng)目為它的程序提供了大量的文檔,這些文檔組成了 Linux 命令行實(shí)驗(yàn)的核心。 這里你可以看到一個(gè)完整的列表:

    http://www.gnu.org/manual/manual.html

  • Wikipedia 有一篇關(guān)于手冊頁的有趣文章:

    http://en.wikipedia.org/wiki/Man_page