Linux BASH Shell命令排列任務(wù)調(diào)度和替換
命令的排列
現(xiàn)在您將看到一些常用的命令排列。您可能想在一行中給出所有命令,然后就可以把注意力轉(zhuǎn)移到其他地方。沒(méi)問(wèn)題,shell 允許您在不同的命令之間,放上特殊的排列字符(queuing characters) 。這兒將介紹最常用的兩種。
請(qǐng)注意,為了看起來(lái)更清楚,我在這些字符兩旁加了空格。而在實(shí)際應(yīng)用中,您不一定要這么做,'ls -a ; du -hs'和'ls -a;du -hs'的效果是一樣的。
command1 ; command2先執(zhí)行 command1 ,不管 command1 是否出錯(cuò),接下來(lái)執(zhí)行 command2 。
#p#例如:ls -a ; du -hs
將先在屏幕上列出目錄中的所有內(nèi)容,然后列出所有目錄及其子目錄所占磁盤(pán)大小。
command1 && command2
只有當(dāng) command1 正確運(yùn)行完畢后,才執(zhí)行 command2 。
例如:
ls -a bogusdir && du -hs
將返回 ls: bogusdir: No such file or directory , 而'du'則根本沒(méi)有運(yùn)行(這是因?yàn)槟鷽](méi)有'bogusdir'目錄)。如果您將符號(hào)換成了';','du'將被執(zhí)行。為了進(jìn)一步說(shuō)明';'和'&&'的區(qū)別,及一般命令排列的用處,下面舉一個(gè)經(jīng)典的例子:linux內(nèi)核的編譯和安裝。
要編譯、安裝 linux ,您需要執(zhí)行一串命令:'make dep'、'make clean'、'make bzImage'、'make modules'、'make modules_install'和'make install'。如果要等一個(gè)命令完成后,再輸入下一個(gè),再等,再輸入,……,那就太麻煩了。另一方面,每個(gè)命令只有當(dāng)前面的命令都正確執(zhí)行完畢后,才能開(kāi)始執(zhí)行。如果您用';'來(lái)排列命令,則即使有命令執(zhí)行失敗, 后面的也照常運(yùn)行,最后,您可能在'/boot'目錄下得到一個(gè)有問(wèn)題的內(nèi)核映像(image)。而用'&&':make dep && make clean && make bzImage && make modules && make modules_install && make install
不需要中途打斷,就可以編譯內(nèi)核及其模塊,并完成后面的安裝。
命令的任務(wù)調(diào)度
當(dāng)您在終端里運(yùn)行一個(gè)命令或開(kāi)啟一個(gè)程序時(shí),終端要等到命令或程序運(yùn)行完畢后,才能再被使用。在 Unix 中,我們稱這樣的命令或程序在前臺(tái)(foreground)運(yùn)行。如果您想在終端下運(yùn)行另一個(gè)命令,則需要再打開(kāi)一個(gè)新的終端。
但這里還有一個(gè)更優(yōu)雅的辦法,稱為任務(wù)調(diào)度(jobbing)或后臺(tái)(backgrounding)。當(dāng)您運(yùn)用任務(wù)的調(diào)度或?qū)⒚钪糜诤笈_(tái),終端就立即解放了,這樣一來(lái),終端立即就可以接受新的輸入。為實(shí)現(xiàn)這樣的目的,您只需在命令后面添加一個(gè) & :gqview &
告訴 shell 將圖片查看器'GQview'放到后臺(tái)去執(zhí)行(即當(dāng)成 job 來(lái)運(yùn)行)。命令 jobs 將告訴您,在這個(gè)終端窗口中,運(yùn)行著哪些命令與程序:
jobs
[1]+ Running gqview &
當(dāng)您要關(guān)閉終端窗口時(shí),這一點(diǎn)就很重要,因?yàn)殛P(guān)閉終端將導(dǎo)致所有在其中運(yùn)行的任務(wù)都將被中止,在此例中,如果您關(guān)閉了終端,由這個(gè)終端開(kāi)啟的 GQview 程序也將被關(guān)閉。但如何將前臺(tái)運(yùn)行的一個(gè)程序放到后臺(tái)去?沒(méi)問(wèn)題:
gqview
[2]+ Stopped gqview
bg
[2]+ gqview &
組合鍵 將掛起終端中正在運(yùn)行的程序,然后您就可以用 bg 命令將其放到后臺(tái)去執(zhí)行。請(qǐng)注意,在后臺(tái)運(yùn)行圖形應(yīng)用程序有時(shí)候是有用處的,這樣可以在終端下顯示這個(gè)程序的
出錯(cuò)信息,雖然這對(duì)您可能沒(méi)有直接的幫助,當(dāng)如果碰到了麻煩,向別人詢問(wèn)時(shí),這些出錯(cuò)提示就有用武之地了。
一些圖形程序,很可能還處在測(cè)試期(Beta),盡管在后臺(tái)執(zhí)行,也會(huì)在終端中輸出一些信息。如果您對(duì)此不滿,可以用下面命令:
command &>/dev/null &
這不僅將程序送到后臺(tái)執(zhí)行,還將其輸出發(fā)到'/dev/null'文件。 '/dev/null'是系統(tǒng)的"碎紙機(jī)" (shredder),所有送到那里的信息都將消失殆盡。
命令的替換
命令替換(Command substitution)是一項(xiàng)很實(shí)用的功能。我們假設(shè),您想看看 XFree86文檔中的 'README.mouse'文件,但您不知道這個(gè)文件的位置。但您是位機(jī)靈的用戶,已經(jīng)聽(tīng)說(shuō)了'locate'命令,也安裝了'slocate'包,您就可以用:
locate README.mouse
發(fā)現(xiàn)那個(gè)文件在'/usr/X11R6/lib/X11/doc'。現(xiàn)在您就可以在終端里用'less'或在文件管理器中進(jìn)入那個(gè)目錄然后讀取文件。而命令替換可以給您帶來(lái)一些便捷:less $(locate README.mouse)一步到位。命令'locate README.mouse'的輸出(= /usr/X11R6/lib/X11/doc/README.mouse)
作為'less'的參數(shù),然后就可以顯示文件內(nèi)容了。
這種機(jī)制的語(yǔ)法是:
command1 $(command2)
除了'$( )',您還可以用后引號(hào)(backquote):
command1 `command2`
這樣雖然可以減少輸入,但可讀性差,而且很容易就和沒(méi)有替換功能的一般單引號(hào)混淆。這里有另外一個(gè)例子。我們假設(shè),您打算結(jié)束一個(gè)名為'rob'的程序。您先得用命令'pidof'找出相應(yīng)的進(jìn)程號(hào)(Process ID),然后以這個(gè) PID 為參數(shù),運(yùn)行'kill'命令,這樣就
可以結(jié)束'rob'程序。除了用:
pidof rob
567
kill 567
您還可以試試:
kill `pidof rob`
怎么樣,效率有所提高吧?
【編輯推薦】