Ken Thompson 曾經就如何設計簡潔而高效的操做系統提出過一個原則,
就是咱們如今奉爲圭臬的 Unix 程序設計準則(Unix Philosophy):「一次只
作一件事,並作到最好(Do one thing and do itwell)」。 Linux 做爲一種類
Unix 操做系統也秉承了這個準則。若是仔細回想一下,咱們會發現咱們前面所
提到過的各類 Linux 程序(命令)無不體現了這個準則:這些程序大多目的明
確專注,而且每每可以又快又好地達成目標。
Doug McIlroy 將 Unix 準則擴展並概括以下,一個好的程序應該: a)一次
只作一件事,並作到最好; b)可以與其餘程序協同工做; c)可以處理文本流。
(Write programs that doone thing and do it well. Write programs to work
together. Write programs tohandle text streams, because that is a universal
interface)。咱們接下來要討論的就是:如何有效地讓 Linux 的程序協同工做。
其中主要涉及到以下兩個主題:
對命令的輸入/輸出文本流進行重定向(Redirection);
將一個命令的輸出經過管道(Pipes)鏈接到另外一個命令的輸入。
接下來,咱們就對這兩個主題進行一個詳細闡述。
輸入/輸出文本流和重定向
所謂輸入/輸出文本流很容易理解,咱們在「初次接觸 Linux」的任務 1
中提到過, Linux 經過 Shell 與用戶進行交互。而 Shell 正是使用輸入流向程序
提供輸入,經常指的是終端鍵盤;而用輸出流在終端上顯示程序輸出,之前往
往指的是 ASCII 打字機或終端顯示屏,如今通常是圖形桌面上的窗口。
不過確切來講, Bash 實際上使用三種標準輸入輸出流:
標準輸出流(stdout),顯示來自命令的輸出,文件描述符是 1。
標準錯誤輸出流(stderr),顯示來自命令的錯誤輸出,文件描述符
是 2。linux
標準輸入流(stdin),向命令提供輸入,文件描述符是 0。
對於任何一條 linux 命令執行,它會是這樣一個過程:
圖 1 命令文本流
先有一個輸入:輸入能夠從鍵盤或者其餘輸入設備,經過 stdin 交給命
令。命令執行完成:成功了,會把成功結果經過 stdout 輸出到輸出設備上:;
若是命令執行有錯誤:會把錯誤結果經過 stderr 也輸出到屏幕上面。通常狀況
下,咱們能夠將 stdout 和 stderr 視爲終端屏幕或者終端窗口,而將 stdin 視爲
終端鍵盤。操作系統
注意 linux 文件描述符:能夠理解爲 linux 跟蹤打開文件,
而分配的一個數字,這個數字有點相似 c 語言操做文件
時候的句柄,經過句柄就能夠實現文件的讀寫操做。
linux 啓動後,會默認打開 3 個文件描述符,分別
是:標準輸入 standard input 0,正確輸出 standard out
put 1,錯誤輸出: error output 2
這些默認的輸出,輸入都是默認,咱們在使用過程當中,有時候並不但願
執行結果輸出到屏幕,例如咱們想將結果輸出到文件或其它設備或者簡單丟
棄。這個時候咱們就須要進行輸出重定向了。簡單來講,輸出重定向指的就是
將某個程序默認指向 stdout 或者 stderr 的輸出文本流轉而指向另外一個文件,也
即程序輸出到某個指定文件中而不是輸出到終端屏幕或者終端窗口中了。
重要 對輸出進行重定向有兩種方法:
n> ,表示未來自文件描述符 n 的輸出重定向到文
件。必須對這個文件有寫權限。若是文件不存在,就創
建它。若是它存在,將覆蓋原有文件內容;
n>>,也表示未來自文件描述符 n 的輸出重定向到文
件。一樣,必須對這個文件有寫權限。若是文件不存
在,就建立它。若是它存在,輸出就附加到現有文件後
面。
其中, n> 或 n>> 中的 n 是指文件描述符。若是忽略,就假設是標準輸
出。
有時候但願將標準輸出和標準錯誤重定向到同一個文件中。自動化腳本或
後臺做業經常採用這種作法,這樣就可以在之後查看輸出。可使
用 &> 或 &>> 將標準輸出和標準錯誤重定向到同一個位置。另外一種方法是對文
件描述符 n 進行重定向,而後使用 m>&n 或 m>>&n 將文件描述符 m 重定向到
同一個位置。
對輸出進行重定向的次序很重要。例如, command 2>&1>output.txt 與
command>output.txt 2>&1 不同。
有時候但願徹底忽略標準輸出或標準錯誤。爲此,能夠把適當的流重定向
到 /dev/null 中。
而輸出重定向則指的是讓某個程序從指定文件中獲取輸入而非從 stdin 中
(經常指鍵盤)獲取輸入了。正如能夠對標準輸出流 stdout 和標準錯誤輸出流
stderr 進行重定向,咱們也可使用 < 操做符將 stdin 重定向爲來自文件。
Bash 還有 here-document 的概念,這是輸入重定向的另外一種形式。這使
用 << 以及一個單詞(好比 EOF),這個單詞做爲輸入結束的標誌。設計