- 論壇徽章:
- 0
|
bash
前言
本文譯自《Slackware Linux Unleashed》(第三版)一書的 bash 一章,但做了一些必要的刪節(jié),并且有的地方根據(jù)實(shí)際情況作了較大的改動(dòng),必要的話請(qǐng)參考原文。對(duì)本文有任何問(wèn)題的話請(qǐng)與我聯(lián)系:con@nease.net
簡(jiǎn)介
本文將較為詳細(xì)地介紹 Linux 下最常用的 shell,bash。bash(Bourne Again Shell) 是 Linux 的缺省 shell,并被大多數(shù)用戶所使用,在本文中你將學(xué)會(huì):
什么是shell
Linux上最常見(jiàn)的shell
命令補(bǔ)齊(Command-line completion)和通配
命令歷史記錄(Command history)和別名
重定向和管道
改變提示符
進(jìn)程控制(Job control)
如何用戶化配置你的bash shell
另外你還將看到一些最常用的bash命令和內(nèi)存變量的用法,讀完本文后你將能更快和更有效地使用bash。
Shells in a Nutshell
什么是shell?總之這個(gè)詞好象總是出現(xiàn)在 Linux 里,但很多新用戶并不清楚它的明確的含義。本節(jié)將給出一個(gè)確切的解釋并說(shuō)明為什么在Linux中它顯得如此的重要。
什么是Shell?
shell是你(用戶)和Linux(或者更準(zhǔn)確的說(shuō),是你和Linux內(nèi)核)之間的接口程序。你在提示符下輸入的每個(gè)命令都由shell先解釋然后傳給Linux內(nèi)核。
--------------------------------------------------------------------------------
注意: 如果你熟悉m$-dos,你將認(rèn)出這很象DOS 用戶和 COMMAND.COM之間的關(guān)系。唯
一的區(qū)別是command.com 的功能遠(yuǎn)不能和shell 相提并論。
--------------------------------------------------------------------------------
shell 是一個(gè)命令語(yǔ)言解釋器(command-language interpreter)。擁有自己內(nèi)建的 shell 命令集。此外,shell也能被系統(tǒng)中其他有效的Linux 實(shí)用程序和應(yīng)用程序(utilities and application programs)所調(diào)用。
不論何時(shí)你鍵入一個(gè)命令,它都被Linux shell所解釋。一些命令,比如打印當(dāng)前工作目錄命令(pwd),是包含在Linux bash內(nèi)部的(就象DOS的內(nèi)部命令)。其他命令,比如拷貝命令(cp)和移動(dòng)命令(rm),是存在于文件系統(tǒng)中某個(gè)目錄下的單獨(dú)的程序。而對(duì)用戶來(lái)說(shuō),你不知道(或者可能不關(guān)心)一個(gè)命令是建立在shell內(nèi)部還是一個(gè)單獨(dú)的程序。
附圖展示了 shell 是如何執(zhí)行命令解釋的,shell 首先檢查命令是否是內(nèi)部命令,不是的話再檢查是否是一個(gè)應(yīng)用程序,這里的應(yīng)用程序可以是Linux本身的實(shí)用程序,比如ls 和 rm,也可以是購(gòu)買的商業(yè)程序,比如 xv,或者是公用軟件(public domain software),就象 ghostview。然后shell試著在搜索路徑里尋找這些應(yīng)用程序。搜索路徑是一個(gè)能找到可執(zhí)行程序的目錄列表。如果你鍵入的命令不是一個(gè)內(nèi)部命令并且在路徑里沒(méi)有找到這個(gè)可執(zhí)行文件,將會(huì)顯示一條錯(cuò)誤信息。而如果命令被成功的找到的話,shell的內(nèi)部命令或應(yīng)用程序?qū)⒈环纸鉃橄到y(tǒng)調(diào)用并傳給Linux內(nèi)核。
shell的另一個(gè)重要特性是它自身就是一個(gè)解釋型的程序設(shè)計(jì)語(yǔ)言,shell 程序設(shè)計(jì)語(yǔ)言支持在高級(jí)語(yǔ)言里所能見(jiàn)到的絕大多數(shù)程序控制結(jié)構(gòu),比如循環(huán),函數(shù),變量和數(shù)組。shell 編程語(yǔ)言很易學(xué),并且一旦掌握后它將成為你的得力工具。任何在提示符下能鍵入的命令也能放到一個(gè)可執(zhí)行的shell程序里,這意味著用shell語(yǔ)言能簡(jiǎn)單地重復(fù)執(zhí)行某一任務(wù)。
shell 如何啟動(dòng)
shell在你成功地登錄進(jìn)入系統(tǒng)后啟動(dòng),并始終作為你與系統(tǒng)內(nèi)核的交互手段直至你退出系統(tǒng)。你系統(tǒng)上的每位用戶都有一個(gè)缺省的shell。每個(gè)用戶的缺省shell在系統(tǒng)里的passwd文件里被指定,該文件的路徑是/etc/passwd。passwd文件里還包含有其他東西:每個(gè)人的用戶ID號(hào),一個(gè)口令加密后的拷貝和用戶登錄后立即執(zhí)行的程序,(注:為了加強(qiáng)安全性,現(xiàn)在的系統(tǒng)一般都把加密的口令放在另一個(gè)文件--shadow中,而passwd中存放口令的部分以一個(gè)x字符代替)雖然沒(méi)有嚴(yán)格規(guī)定這個(gè)程序必須是某個(gè)Linux shell,但大多數(shù)情況下都如此。
最常用的shell
在Linux 和 UNIX系統(tǒng)里可以使用多種不同的shell可以使用。最常用的幾種是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三種shell 都有它們的優(yōu)點(diǎn)和缺點(diǎn)。Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 并且在每種 UNIX 上都可以使用。Bourne shell 在 shell 編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面作得不如其他幾種 shell。
C shell 由 Bill Joy 所寫,它更多的考慮了用戶界面的友好性。它支持象命令補(bǔ)齊(command-line completion)等一些 Bourne shell 所不支持的特性。普遍認(rèn)為C shell 的編程接口做的不如 Bourne shell, 但 C shell 被很多 C 程序員使用因?yàn)?C shell的語(yǔ)法和 C語(yǔ)言的很相似,這也是C shell名稱的由來(lái)。
Korn shell (ksh) 由 Dave Korn 所寫。它集合了C shell 和 Bourne shell 的優(yōu)點(diǎn)并且和 Bourne shell 完全兼容。
除了這些 shell 以外,許多其他的 shell 程序吸收了這些原來(lái)的 shell 程序的優(yōu)點(diǎn)而成為新的 shell 。在 Linux 上常見(jiàn)的有 tcsh (csh 的擴(kuò)展),Bourne Again shell(bash, sh 的擴(kuò)展), 和Public Domain Korn shell (pdksh, ksh 的擴(kuò)展)。bash 是大多數(shù)Linux 系統(tǒng)的缺省 shell。
The Bourne Again Shell
Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的擴(kuò)展。bash 與 Bourne shell 完全向后兼容,并且在 Bourne shell 的基礎(chǔ)上增加和增強(qiáng)了很多特性。bash 也包含了很多 C 和 Korn shell 里的優(yōu)點(diǎn)。bash 有很靈活和強(qiáng)大的編程接口,同時(shí)又有很友好的用戶界面。
為什么要用 bash 來(lái)代替 sh 呢?Bourne shell 最大的缺點(diǎn)在于它處理用戶的輸入方面。在 Bourne shell 里鍵入命令會(huì)很麻煩,尤其當(dāng)你鍵入很多相似的命令時(shí)。而 bash 準(zhǔn)備了幾種特性使命令的輸入變得更容易。
命令補(bǔ)齊(Command-Line Completion)
通常你在 bash (或任何其他的 shell)下輸入命令時(shí)你不必把命令輸全 shell 就能判斷出你所要輸入的命令。例如,假定當(dāng)前的工作目錄包含以下的文件和子目錄:
News/ bin/ games/ mail/ samplefile test/
如果你要進(jìn)入 test 子目錄,你將會(huì)輸入以下的命令:
cd test
這個(gè)命令能夠滿足你的需要,但 bash還提供了稍微不同的方法來(lái)完成同樣的事。因?yàn)?test 是當(dāng)前目錄里唯一以字母 t開(kāi)頭的子目錄,bash在你只輸入字母 t后就能判斷出你要做什么了:
cd t
在你鍵入那個(gè)字母后,唯一的可能就是 test 。想讓 bash 幫你結(jié)束命令的話,按下 Tab 鍵:
cd t<tab>;
當(dāng)你這樣做以后,bash 將幫你補(bǔ)齊命令并顯示在屏幕上。但在你按下回車鍵以前命令并沒(méi)有被執(zhí)行,bash 會(huì)讓你檢驗(yàn)補(bǔ)齊的命令是否是你真正需要的。在輸入象這樣短的命令時(shí)你也許看不出它的價(jià)值所在,甚至在命令很短時(shí)還會(huì)簡(jiǎn)慢輸入的速度,但是當(dāng)你要輸入的命令有點(diǎn)長(zhǎng)時(shí),你會(huì)發(fā)現(xiàn)這個(gè)特性是多么的美好。
但是當(dāng)目錄里有不止一個(gè)以字母 t 開(kāi)頭的文件時(shí)會(huì)發(fā)生什么情況呢?在你使用命令補(bǔ)齊時(shí)會(huì)有問(wèn)題,讓我們看看下面的情況,當(dāng)前目錄里有下列內(nèi)容:
News/ bin/ mail/ samplefile test/ tools/ working/
現(xiàn)在這個(gè)目錄里有兩個(gè)以字母 t 開(kāi)頭的文件。假設(shè)你仍然想進(jìn)入 test 子目錄,如何使用命令補(bǔ)齊呢?如果你象先前那樣鍵入:
cd t<tab>;
bash 將不知道你到底想進(jìn)入哪個(gè)子目錄,因?yàn)榻o出的信息并不唯一。如果你這樣做了的話,bash 將發(fā)出一聲蜂鳴提醒你沒(méi)有足夠的信息來(lái)補(bǔ)齊你的命令。蜂鳴之后bash 并不改變輸入的命令,這將使你能在原來(lái)的基礎(chǔ)上再輸入更多的信息,在這個(gè)例子中你僅需再鍵入一個(gè) e 并再按一下 Tab 鍵,這時(shí) bash 就有足夠的信息來(lái)完成你的命令了:
cd test
當(dāng)你輸入命令時(shí)不論何時(shí)按下 Tab 鍵,bash 都將盡其所能地試圖補(bǔ)齊命令,不行的話會(huì)發(fā)出蜂鳴來(lái)提醒你需要更多的信息。你需要鍵入更多的字符,并再次按下 Tab 鍵,重復(fù)這個(gè)過(guò)程直至你期望的命令出現(xiàn)。
通配符
另一個(gè)使命令輸入變得更簡(jiǎn)單的方法是在命令中使用通配符。bash 支持三種通配符:
* 匹配任何字符和任何數(shù)目的字符
? 匹配任何單字符
[...] 匹配任何包含在括號(hào)里的單字符
* 通配符的使用有些象命令補(bǔ)齊。例如,假設(shè)當(dāng)前目錄包含以下文件:
News/ bin/ games/ mail/ samplefile test/
如果你想進(jìn)入 test 目錄,你將鍵入 cd test, 或者你想用命令補(bǔ)齊:
cd t<tab>;
現(xiàn)在有第三種方法來(lái)做同樣的事。因?yàn)閮H有一個(gè)文件以字母 t 開(kāi)頭,你也能用 * 通配符來(lái)進(jìn)入該目錄。鍵入下列命令:
cd t*
* 匹配任何字符和任何數(shù)目的字符,所以 shell 將把 t* 替換為 test(當(dāng)前目錄里唯一和通配方案匹配的文件)。當(dāng)前目錄里只有一個(gè)文件以字母 t 開(kāi)頭的話這將是可靠的。但是如果當(dāng)前目錄里有不止一個(gè)文件以字母 t 開(kāi)頭,shell 將試著進(jìn)入第一個(gè)符合匹配方案的目錄,這個(gè)目錄是以字母表排序的第一個(gè)目錄,這個(gè)目錄也許是也許不是你所期望的。
通配符 * 的一個(gè)更實(shí)際的用途是通配你要執(zhí)行的命令中的多個(gè)名字相似的文件。例如,假設(shè)當(dāng)前目錄里包含以下文件:
ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/
如果你需要打印所有擴(kuò)展名是 .doc 的文件,你能使用象這樣簡(jiǎn)化的命令:
lpr *.doc
在這個(gè)例子中,bash 將把 *.doc 替換為當(dāng)前目錄下所有文件名符合通配方案的文件。在 bash 進(jìn)行了替換后,該命令將被處理為:
lpr ch1.doc ch2.doc ch3.doc
lpr 命令將以ch1.doc, ch2.doc, 和 ch3.doc為參數(shù)被調(diào)用。
--------------------------------------------------------------------------------
注意: 除了以上給出的例子外,還有幾種方法:
lpr *doc
lpr *oc
lpr *c
--------------------------------------------------------------------------------
通配符 ? 除了只能匹配單個(gè)字符外,其他功能都與通配符 * 相同,如果用通配符 ? 來(lái)打印前面提到的那個(gè)目錄里所有擴(kuò)展名是 .doc 的文件的話,鍵入下面的命令:
lpr ch?.doc
通配符[...]能匹配括號(hào)中給出的字符或字符范圍。同樣以前面的目錄為例,打印那個(gè)目錄里所有擴(kuò)展名是 .doc 的文件,你可以鍵入下列命令之一:
lpr ch[123].doc
或者:
lpr ch[1-3].doc
命令歷史記錄
bash 也支持命令歷史記錄。這意味著 bash 保留了一定數(shù)目的你先前已經(jīng)在shell 里輸入過(guò)的命令。這個(gè)數(shù)目取決于一個(gè)叫做HISTSIZE的變量。有關(guān) HISTSIZE 的更多信息,請(qǐng)看本文后面的“bash 變量”一節(jié)。
bash 把你先前輸入的命令文本保存在一個(gè)歷史列表中。當(dāng)你用你的帳號(hào)登錄后歷史列表將根據(jù)一個(gè)歷史文件被初始化。歷史文件的文件名被一個(gè)叫 HISTFILE 的 bash變量指定。歷史文件的缺省名字是 .bash_history。這個(gè)文件通常在你的用戶目錄中。(注意該文件的文件名以一個(gè)句號(hào)開(kāi)頭,這意味著它是隱含的,僅當(dāng)你帶 -a 或 -A參數(shù)的 ls 命令列目錄時(shí)才可見(jiàn))
僅將先前的命令存在歷史文件里是沒(méi)有用的,所以 bash 提供了幾種方法來(lái)調(diào)用它們。使用歷史記錄列表最簡(jiǎn)單的方法是用上方向鍵。按下上方向鍵后最后鍵入的命令將出現(xiàn)在命令行上。再按一下則倒數(shù)第二條命令會(huì)出現(xiàn),以此類推。如果上翻多了的話也可以用向下的方向鍵來(lái)下翻。(和 DOS 實(shí)用程序doskey一樣)如果需要的話,顯示在命令行上的歷史命令可以被編輯。
另一個(gè)使用命令歷史文件的方法是用 bash 的內(nèi)部命令 history 和 fc(fix 命令)命令來(lái)顯示和編輯歷史命令。history 命令能以兩種不同的方法來(lái)調(diào)用。第一種是:
history [n]
當(dāng) history 命令沒(méi)有參數(shù)時(shí),整個(gè)歷史命令列表的內(nèi)容將被顯示出來(lái)。下面是一個(gè)命令歷史列表的例子:
1 mkdir /usr/games/pool
2 cp XpoolTable-1.2.linux.tar.z /usr/games/pool
3 cd /usr/games/pool/
4 ls
5 gunzip XpoolTable-1.2.linux.tar.z
6 tar -xf XpoolTable-1.2.linux.tar
7 ls
8 cd Xpool
9 ls
10 xinit
11 exit
12 which zip
13 zip
14 more readme
15 vi readme
16 exit
使用 n 參數(shù)的作用是僅有最后 n 個(gè)歷史命令會(huì)被列出。例如,history 5 顯示最后 5 個(gè)命令。
調(diào)用 history 命令的第二種方法用于修改命令歷史列表文件的內(nèi)容。命令的語(yǔ)法如下:
history [-r|w|a|n] [filename]
這種形式中,-r 選項(xiàng)告訴 history 命令讀命令歷史列表文件的內(nèi)容并且把它們當(dāng)作當(dāng)前的命令歷史列表。-w 選項(xiàng)將把當(dāng)前的命令歷史記錄寫入文件中并覆蓋文件原來(lái)的內(nèi)容。-a 選項(xiàng)把當(dāng)前的命令歷史記錄追加到文件中。-n 選項(xiàng)將讀取文件中的內(nèi)容并加入到當(dāng)前歷史命令列表中。如果 filename 選項(xiàng)沒(méi)有被指定,history 命令將用變量HISTFILE 的值來(lái)代替。
fc 命令能用兩種方法來(lái)編輯歷史命令。第一種使用下列語(yǔ)法:
fc [-e editor_name] [-n] [-l] [-r] [first] [last]
這里所有參數(shù)都是可選的。-e editor_name 選項(xiàng)用來(lái)指定用于編輯命令的文本編輯器。 first 和 last 選項(xiàng)用于選擇列出歷史命令的范圍,既可以是數(shù)字也可以是字符串。-n 選項(xiàng)禁止列出命令的編號(hào)。-r 選項(xiàng)反向列出匹配的命令。-l 選項(xiàng)把匹配的命令行列在屏幕上(而不是在編輯器中)。如果-e editor_name參數(shù)沒(méi)有被指定,則以變量FCEDIT的值來(lái)代替,如果該變量不存在的話,則用變量EDITOR的值來(lái)代替,都不存在的話將使用vi編輯器。
別名
bash 的另一個(gè)使你的工作變得輕松的方法是命令別名。命令別名通常是其他命令的縮寫,用來(lái)減少鍵盤輸入。例如,你經(jīng)常要鍵入如下的命令,你也許會(huì)傾向于為它建立一個(gè)別名來(lái)減少工作量:
cd /usr/X11/lib/X11/fvwm/sample-configs
假如為這個(gè)長(zhǎng)命令建立一個(gè)名為goconfig的別名,在bash提示符下鍵入如下命令:
alias goconfig=\'cd /usr/X11/lib/X11/fvwm/sample-configs\'
現(xiàn)在,除非你退出bash,鍵入goconfig將和原來(lái)的長(zhǎng)命令有同樣的作用。如果想取消別名,可以使用下面的命令:
unalias goconfig
這是一些很多用戶認(rèn)為有用的別名,你可以把它們寫入你的.profile文件中提高工作效:
alias ll=\'ls -l\'
alias log=\'logout\'
alias ls=\'ls -F\'
如果你是一名DOS用戶并且習(xí)慣了DOS命令,你能下面的別名定義使你的 Linux 表現(xiàn)得象DOS 一樣:
alias dir=\'ls\'
alias copy=\'cp\'
alias rename=\'mv\'
alias md=\'mkdir\'
alias rd=\'rmdir\'
--------------------------------------------------------------------------------
注意: 在定義別名時(shí),等號(hào)的兩頭不能有空格,否則 shell 不能決定你需要做 什么。僅在你的命令中包含有空格或特殊字符時(shí)才需要引號(hào)。
--------------------------------------------------------------------------------
如果你鍵入不帶任何參數(shù)的alias命令,將顯示所有已定義的別名,例如:
alias dir=\'ls\'
alias ll=\'ls -l\'
alias ls=\'ls -F\'
alias md=\'mkdir\'
alias net=\'term < /dev/modem >; /dev/modem 2>; /dev/null&\'
alias rd=\'rmdir\'
輸入重定向
輸入重定向用于改變一個(gè)命令的輸入源。一些命令需要在命令行里輸入足夠的信息才能工作。比如 rm,你必須在命令行里告訴 rm 它你要?jiǎng)h除的文件。另一些命令則需要更詳細(xì)的輸入,這些命令的輸入可能是一個(gè)文件。比如命令 wc 統(tǒng)計(jì)輸入給它的文件里的文件里的字符數(shù),單詞數(shù)和行數(shù)。如果你僅在命令行上鍵入 wc <enter>; ,wc 將等待你告訴它要統(tǒng)計(jì)什么,這時(shí) bash 就好象死了一樣,你鍵入的每樣?xùn)|西都出現(xiàn)在屏幕上,但什么事也不會(huì)發(fā)生。這是因?yàn)?wc 命令正在為自己收集輸入。如果你按下Ctrl-D,wc 命令的結(jié)果將被寫在屏幕上。如果你輸入一個(gè)文件名做參數(shù),象下面的例子一樣,wc 將返回文件所包含的字符數(shù),單詞數(shù),和行數(shù):
wc test
11 2 1
另一種把test文件內(nèi)容傳給 wc 命令的方法是重定向 wc 的輸入。< 符號(hào)在bash里用于把當(dāng)前命令的輸入重定向?yàn)橹付ǖ奈募。所以可以用下面的命令?lái)把 wc 命令的輸入重定向?yàn)?test 文件:
wc < test
11 2 1
輸入重定向并不經(jīng)常使用因?yàn)榇蠖鄶?shù)命令都以參數(shù)的形式在命令行上指定輸入文件的文件名。盡管如此,當(dāng)你使用一個(gè)不接受文件名為輸入?yún)?shù)的命令,而需要的輸入又是在一個(gè)已存在的文件里時(shí),你就能用輸入重定向解決問(wèn)題。
輸出重定向
輸出重定向比輸入重定向更常用。輸出重定向使你能把一個(gè)命令的輸出重定向到一個(gè)文件里,而不是顯示在屏幕上。
很多情況下都可以使用這種功能。例如,如果某個(gè)命令的輸出很多,在屏幕上不能完全顯示,你能把它重定向到一個(gè)文件中,稍后再用文本編輯器來(lái)打開(kāi)這個(gè)文件;當(dāng)你想保存一個(gè)命令的輸出時(shí)也可以使用這種方法。還有,輸出重定向可以用于把一個(gè)命令的輸出當(dāng)作另一個(gè)命令的輸入時(shí)。(還有一種更簡(jiǎn)單的方法可以把一個(gè)命令的輸出當(dāng)作另一個(gè)命令的輸入,就是使用管道,管道的使用將在本文的“管道”一節(jié)介紹)
輸出重定向的使用與輸入重定向很相似,但是輸出重定向的符號(hào)是 >; 。
--------------------------------------------------------------------------------
注意:記憶輸入/輸出重定向符號(hào)的最好方法是把<看作是一個(gè)漏斗,漏斗的小口 指向需要輸入的命令(因?yàn)樾枰邮茌斎氲拿顣?huì)在 <的左手邊),而把>; 當(dāng)作一個(gè)大口指向有輸出的命令的漏斗。
--------------------------------------------------------------------------------
重定向舉例,當(dāng)你要把 ls 命令的輸出保存為一個(gè)名為 directory.out 的文件時(shí),你可以使用下面的命令:
ls >; directory.out
管道
管道可以把一系列命令連接起來(lái)。這意味著第一個(gè)命令的輸出會(huì)通過(guò)管道傳給第二個(gè)命令而作為第二個(gè)命令的輸入,第二個(gè)命令的輸出又會(huì)作為第三個(gè)命令的輸入,以此類推。而管道行中最后一個(gè)命令的輸出才會(huì)顯示在屏幕上(如果命令行里使用了輸出重定向的話,將會(huì)放進(jìn)一個(gè)文件里)。
你能通過(guò)使用管道符 | 來(lái)建立一個(gè)管道行,下面的示例就是一個(gè)管道行:
cat sample.text | grep \"High\" | wc -l
這個(gè)管道將把 cat 命令(列出一個(gè)文件的內(nèi)容)的輸出送給grep命令。grep 命令在輸入里查找單詞 High,grep命令的輸出則是所有包含單詞 High的行,這個(gè)輸出又被送給 wc命令。帶 -l選項(xiàng)的 wc命令將統(tǒng)計(jì)輸入里的行數(shù)。假設(shè) sample.txt的內(nèi)容如下:
Things to do today:
Low: Go grocery shopping
High: Return movie
High: Clear level 3 in Alien vs. Predator
Medium: Pick up clothes from dry cleaner
管道行將返回結(jié)果 2,指出你今天有兩件很重要的事要做:
cat sample.text | grep \"High\" | wc -l
2
提示符
bash 有兩級(jí)用戶提示符。第一級(jí)是你經(jīng)?吹降 bash 在等待命令輸入時(shí)的提示符。缺省的一級(jí)提示符是字符$(如果是超級(jí)用戶,則是#號(hào))。你可以通過(guò)改變bash 的PS1變量的值來(lái)改變你的缺省提示符,例如:
PS1=\" lease enter a command\"
把bash shell 的提示符該為指定的字符串。
當(dāng)bash 期待輸入更多的信息以完成命令時(shí)顯示第二級(jí)提示符。缺省的第二級(jí)提示符是 >;。 果你要改變第二級(jí)提示符,可以通過(guò)設(shè)置PS2變量的值來(lái)實(shí)現(xiàn):
PS2=\"I need more information\"
另外你還可以用特殊的字符來(lái)定義你的提示符,下面的列表列出了最常用的特殊字符。
提示符特殊字符代碼
字符 含義
\\! 顯示該命令的歷史記錄編號(hào)。
\\# 顯示當(dāng)前命令的命令編號(hào)。
\\$ 顯示$符作為提示符,如果用戶是root的話,則顯示#號(hào)。
\\\\ 顯示反斜杠。
\\d 顯示當(dāng)前日期。
\\h 顯示主機(jī)名。
\\n 打印新行。
\\nnn 顯示nnn的八進(jìn)制值。
\\s 顯示當(dāng)前運(yùn)行的shell的名字。
\\t 顯示當(dāng)前時(shí)間。
\\u 顯示當(dāng)前用戶的用戶名。
\\W 顯示當(dāng)前工作目錄的名字。
\\w 顯示當(dāng)前工作目錄的路徑。
這些特殊字符能組合成很多種有用的提示符方案(也可以組合為很奇異的方案),例如把 PS1 設(shè)為:
PS1=\"\\t\"
這導(dǎo)致提示符顯示當(dāng)前的時(shí)間,就象下面的顯示一樣(提示符后面將不會(huì)有空格):
02:16:15
而下面的設(shè)置:
PS1=\\t
將導(dǎo)致提示符變成下面的樣子:
t
這顯示了設(shè)置中引號(hào)的重要性,下面的提示符串:
PS1=\"\\t\\\\ \"
會(huì)使提示符看起來(lái)象這個(gè)樣子:
02:16:30\\
這種情況下,提示符后面會(huì)有一個(gè)空格,因?yàn)橐?hào)里有一個(gè)空格。
作業(yè)控制(Job Control)
作業(yè)控制能夠控制當(dāng)前正在運(yùn)行的進(jìn)程的行為。特別地,你能把一個(gè)正在運(yùn)行的進(jìn)程掛起,稍后再恢復(fù)它的運(yùn)行。bash 保持對(duì)所有已啟動(dòng)的進(jìn)程的跟蹤,你能在一個(gè)正在運(yùn)行的進(jìn)程的生命期內(nèi)的任何時(shí)候把它掛起或是使它恢復(fù)運(yùn)行。
按下 Ctrl-Z 使一個(gè)運(yùn)行的進(jìn)程掛起。bg 命令使一個(gè)被掛起的進(jìn)程在后臺(tái)恢復(fù)運(yùn)行,反之 fg 命令使進(jìn)程在前臺(tái)恢復(fù)運(yùn)行。這幾個(gè)命令在當(dāng)用戶想在后臺(tái)運(yùn)行而意外的把它放到了前臺(tái)時(shí),經(jīng)常被用到。當(dāng)一個(gè)命令在前臺(tái)被運(yùn)行時(shí),它會(huì)禁止用戶與 shell 的交互,直到該命令結(jié)束。這通常不會(huì)造成麻煩,因?yàn)榇蠖鄶?shù)命令很快就執(zhí)行完了。如果你要運(yùn)行的命令要花費(fèi)很長(zhǎng)的時(shí)間的話,我們通常會(huì)把它放到后臺(tái),以使我們能在前臺(tái)繼續(xù)輸入其他命令。例如,你輸入這個(gè)命令:
command find / -name \"test\" >; find.out
它將尋找整個(gè)文件系統(tǒng)中的名為test 的文件并把結(jié)果保存在一個(gè)叫fing.out的文件里。如果在前臺(tái)運(yùn)行的話,根據(jù)文件系統(tǒng)的大小,你的shell將有數(shù)秒甚至數(shù)分鐘不能使用,你不想這樣的話可以再輸入以下面的內(nèi)容:
control-z
bg
find 命令首先被掛起,再在后臺(tái)繼續(xù)被執(zhí)行,并且你能馬上回到bash下。
用戶化配置bash
本文已經(jīng)描述了許多用戶化配置bash的方法。但知道現(xiàn)在為止,我們所做的改動(dòng)都僅在當(dāng)前運(yùn)行的bash下才有效。一旦退出系統(tǒng),所有的改動(dòng)也隨之消失了。為了保存這些用戶化配置,你必須把它們保存到一個(gè)bash的初始化文件里。
你能把任何想每次進(jìn)入cash都執(zhí)行的命令放到初始化文件里。這個(gè)文件里最常見(jiàn)到的命令通常是alias和變量的初始化。bash的初始化文件叫做 profile。每個(gè)使用bash的用戶都有一個(gè) .profile文件在他的用戶目錄里。bash在每次啟動(dòng)時(shí)都讀取這個(gè)文件,并執(zhí)行所有包含的命令。
下面的代碼是缺省的.profile文件的內(nèi)容。這個(gè)文件的位置在 /etc目錄。如果你想設(shè)置自己的bash 的話把它拷到你的用戶目錄里(如果還沒(méi)有的話)并命名為.profile。
--------------------------------------------------------------------------------
注意: 有些setup程序會(huì)在建立用戶時(shí)自動(dòng)放一個(gè).profile文件的拷貝在你的用 戶目錄里。但是并不是所有的都這么做,所以最好先檢查一下你的用戶目 錄。記住所有以句點(diǎn)開(kāi)頭的文件都是隱含的,只有用ls -a或ls -A命令才 能列出。
--------------------------------------------------------------------------------
# commands common to all logins
export OPENWINHOME=/usr/openwin
export MINICOM=\"-c on\"
export MANPATH=/usr/local/man:/usr/man/preformat:/usr/man:/X11/man:/usr/openwin /m
an
export HOSTNAME=\"`cat /etc/HOSTNAME`\"
PATH=\"$PATH:/usr/X11/bin OPENWINHOME/bin:/usr/games:.\"
LESS=-MM
# I had problems using \'eval test\' instead of \'TERM=\', but you might want to # try
it anyway. I think with the right /etc/termcap it would work great. # eval \'tset
-sQ \"$TERM\"\'if [ \"$TERM\" = \"\" -o \"$TERM\" =
\"unknown\"]; then
TERM=linux
#PS1=\'\'hostname\':\'pwd\'# `
if [ \"$SHELL\" = \"/bin/pdksh\" -o \"$SHELL\" = \"/bin/ksh\" ]; then
PS1=\"! $\"
elif [ \"$SHELL\" = \"/bin/zsh\" ]; then
PS1=\"%m:%~%# \"
elif [ \"$SHELL\" = \"/bin/ash\" ]; then
PS1=\"$ \"
else
PS1=\'\\h:\\w\\$ `
fi
PS2=\'>; `
ignoreeof=10
export PATH DISPLAY LESS TERM PS1 PS2 ignoreeof
umask 022
# set up the color-ls environment variables:
if [ \"$SHELL\" = \"/bin/zsh\" l; then
eval \'dircolors -z\'
elif [ \"$SHELL\" = \"/bin/ash\" l; then
eval \'dircolors -s\'
else
eval \'dircolors -b\'
fi
echo
fortune
echo
export TAPE=\"/dev/nftape\"
bash 命令概要
這是幾個(gè)最有用的bash內(nèi)部命令:
alias: 設(shè)置bash別名。
bg: 使一個(gè)被掛起的進(jìn)程在后臺(tái)繼續(xù)執(zhí)行。
cd: 改變當(dāng)前工作目錄。
exit: 終止shell。
export: 使變量的值對(duì)當(dāng)前shell的所有子進(jìn)程都可見(jiàn) 。
fc: 用來(lái)編輯歷史命令列表里的命令。
fg: 使一個(gè)被掛起的進(jìn)程在前臺(tái)繼續(xù)執(zhí)行。
help: 顯示bash內(nèi)部命令的幫助信息。
kill: 終止某個(gè)進(jìn)程。
pwd: 顯示當(dāng)前工作目錄。
unalias: 刪除已定義的別名。
bash 還有許多命令,但這些是最常用的,想了解更詳細(xì)的情況,請(qǐng)參考bash的手冊(cè)--在提示符下鍵入 man bash。
bash 變量
這里是幾個(gè)最有用的bash變量,包括變量名和簡(jiǎn)單描述。
EDITOR, FCEDIT: bsah fc 命令的缺省編輯器。
HISTFILE: 用于貯存歷史命令的文件。
HISTSIZE: 歷史命令列表的大小。
HOME: 當(dāng)前用戶的用戶目錄。
OLDPWD: 前一個(gè)工作目錄。
PATH: bash尋找可執(zhí)行文件的搜索路徑。
PS1: 命令行的一級(jí)提示符。
PS2: 命令行的二級(jí)提示符。
PWD: 當(dāng)前工作目錄。
SECONDS: 當(dāng)前shell開(kāi)始后所流逝的秒數(shù)。 |
|