號和管道符號( )在不同場景下的使用方法

2021-09-12 18:32:10 字數 3265 閱讀 8336

掌握連線各個命令之間的連線符號用法也是很重要的。實際上,命令的用法並不難,例如 mkdir、touch和 find 也分別可以簡單概括為「建立新目錄」、「更新檔案」和「在目錄樹中查詢檔案」而已。

但如果要理解

mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &
這一串命令的目的,以及為什麼要這樣寫,就沒有這麼簡單了。

關鍵之處就在於命令之間的連線符號。掌握了這些符號的用法,不僅可以讓你更好理解整體的工作原理,還可以讓你知道如何將不同的命令有效地結合起來,提高工作效率。

在這一篇文章和接下來的文章中,我會介紹如何使用 & 號和管道符號(|)在不同場景下的使用方法。

幕後工作

我來舉乙個簡單的例子,看看如何使用 & 號將下面這個命令放到後台執行:

cp -r original/dir/ backup/dir/
這個命令的目的是將 original/dir/ 的內容遞迴地複製到 backup/dir/ 中。雖然看起來很簡單,但是如果原目錄裡面的檔案太大,在執行過程中終端就會一直被卡住。

cp -r original/dir/ backup/dir/ &
任務被放到後台執行之後,就可以立即繼續在同乙個終端上工作了,甚至關閉終端也不影響這個任務的正常執行。需要注意的是,如果要求這個任務輸出內容到標準輸出中(例如 echo 或 ls),即使使用了 &,也會等待這些輸出任務在前台執行完畢。

當使用 & 將乙個程序放置到後台執行的時候,bash 會提示這個程序的程序 id。在 linux 系統中執行的每乙個程序都有乙個唯一的程序 id,你可以使用程序 id 來暫停、恢復或者終止對應的程序,因此程序 id 是非常重要的。

這個時候,只要你還停留在啟動程序的終端當中,就可以使用以下幾個命令來對管理後台程序:

jobs 命令可以顯示當前終端正在執行的程序,包括前台執行和後台執行的程序。它對每個正在執行中的程序任務分配了乙個序號(這個序號不是程序 id),可以使用這些序號來引用各個程序任務。

$ jobs[1]- running cp -i -r original/dir/* backup/dir/ &[2]+ running find . -iname "*jpg" > backup/dir/images.txt &
fg 命令可以將後台執行的程序任務放到前台執行,這樣可以比較方便地進行互動。根據 jobs 命令提供的程序任務序號,再在前面加上 % 符號,就可以把相應的程序任務放到前台執行。

$ fg %1 # 將上面序號為 1 的 cp 任務放到前台執行

cp -i -r original/dir/* backup/dir/

如果這個程序任務是暫停狀態,fg 命令會將它啟動起來。

使用 ctrl+z 組合鍵可以將前台執行的任務暫停,僅僅是暫停,而不是將任務終止。當使用 fg 或者 bg 命令將任務重新啟動起來的時候,任務會從被暫停的位置開始執行。但 sleep 命令是乙個特例,sleep 任務被暫停的時間會計算在 sleep 時間之內。因為 sleep 命令依據的是系統時鐘的時間,而不是實際執行的時間。也就是說,如果執行了 sleep 30,然後將任務暫停 30 秒以上,那麼任務恢復執行的時候會立即終止並退出。

bg 命令會將任務放置到後台執行,如果任務是暫停狀態,也會被啟動起來。

$ bg %1

[1]+ cp -i -r original/dir/* backup/dir/ &

如上所述,以上幾個命令只能在同乙個終端裡才能使用。如果啟動程序任務的終端被關閉了,或者切換到了另乙個終端,以上幾個命令就無法使用了。

如果要在另乙個終端管理後台程序,就需要其它工具了。例如可以使用 kill 命令從另乙個終端終止某個程序:

kill -s stop
這裡的 pid 就是使用 & 將程序放到後台時 bash 顯示的那個程序 id。如果你當時沒有把程序 id 記錄下來,也可以使用 ps 命令(代表 process)來獲取所有正在執行的程序的程序 id,就像這樣:

ps | grep cp
執行以後會顯示出包含 cp 字串的所有程序,例如上面例子中的 cp 程序。同時還會顯示出對應的程序 id:

$ ps | grep cp

14444 pts/3 00:00:13 cp

在這個例子中,程序 id 是 14444,因此可以使用以下命令來暫停這個後台程序:

kill -s stop 14444

注意,這裡的 stop 等同於前面提到的 ctrl+z 組合鍵的效果,也就是僅僅把程序暫停掉。

如果想要把暫停了的程序啟動起來,可以對程序發出 cont 訊號:

kill -s cont 14444

這個給出乙個可以向程序發出的常用訊號列表。如果想要終止乙個程序,可以傳送 term 訊號:

kill -s term 14444

如果程序不響應 term 訊號並拒絕退出,還可以傳送 kill 訊號強制終止程序:

kill -s kill 14444

強制終止程序可能會有一定的風險,但如果遇到程序無節制消耗資源的情況,這樣的訊號還是能夠派上用場的。

另外,如果你不確定程序 id 是否正確,可以在 ps 命令中加上 x 引數:

$ ps x| grep cp

14444 pts/3 d 0:14 cp -i -r original/dir/hols_2014.mp4

original/dir/hols_2015.mp4 original/dir/hols_2016.mp4

original/dir/hols_2017.mp4 original/dir/hols_2018.mp4 backup/dir/

這樣就可以看到是不是你需要的程序 id 了。

最後介紹乙個將 ps 和 grep 結合到一起的命令:

$ pgrep cp818

1926

3340

4754

6172

8896

136339

6680

13735

14444

pgrep 可以直接將帶有字串 cp 的程序的程序 id 顯示出來。

$ pgrep -lx cp

14444 cp

總結

在命令的末尾加上 & 可以讓我們理解前台程序和後台程序的概念,以及如何管理這些程序。

在 unix/linux 術語中,在後台執行的程序被稱為守護程序daemon。如果你曾經聽說過這個詞,那你現在應該知道它的意義了。

js在IE和FF下的不同

1.document.formname.item itemname 問題 說明 ie下,可以使用document.formname.item itemname 或document.formname.elements elementname firefox下,只能使用document.formname...

SRAM和EEPROM在使用上的不同

sram是英文static ram的縮寫,它是一種具有靜止訪問功能的記憶體,不需要重新整理電路即能儲存它內部儲存的資料。而dram dynamic random access memory 每隔一段時間,要重新整理充電一次,否則內部的資料即會消失,因此sram具有較高的效能,但是sram也有它的缺點...

ul在Firefox和IE下的不同表現

最近做了個oblog的系統模板,其中涉及到了ul,所以就整理出了這篇文章 這張大圖。ul是乙個很常用的標籤,但是因為它在firefox和ie下的不同表現,讓人覺得它是個很難以控制的標籤。ul在firefox下有個padding值,卻沒有margin值 而在ie下正好相反,ul有個margin值,卻沒...