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