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