文本流
文件用于數(shù)據(jù)的存儲,相當于一個個存儲數(shù)據(jù)的房子。我們之前說,所謂的數(shù)據(jù)是0或者1的序列,但嚴格來說,Linux以字節(jié)(byte)來作為數(shù)據(jù)的單位,也就是說這個序列每八位(bit)為一個單位(八位二進制對應(yīng)的十進制范圍為0到255)。使用ASCII編碼,可以將這樣一個字節(jié)轉(zhuǎn)換成為字符。所以,在Linux中,我們所說的數(shù)據(jù),完全可以用字符表達出來,也就是說文本(text)的形式。
實際上,如果以bit為單位處理字符的話,機器會更容易讀懂和傳輸,效率會更高。但為什么Linux依然以字節(jié)為單位進行處理呢?原因在于,相對于以bit為單位處理數(shù)據(jù),以byte為單位可以更容易將數(shù)據(jù)轉(zhuǎn)化為字符。相對于枯燥的0和1,字符更容易被人讀懂 (human readable)。然而,并不是所有的數(shù)據(jù)都是設(shè)計來讓人讀懂的,比如可執(zhí)行文件包含的各種字符對于人來說并沒有什么意義 (因為可執(zhí)行文件是為了讓機器讀懂的)。但Linux依然以字節(jié)為單位處理所有文件,這是為了讓所有文件能夠共用一套接口 (virtual file system),從而減少Linux設(shè)計的復雜度。
("everything is a file"是通常所流傳的UNIX設(shè)計的哲學之一,但Linus對此作出糾正,改為"everything is a stream of bytes"。)
然而,數(shù)據(jù)不是在找到了自己的房子(file)之后就永遠的定居下來。它往往要被讀入到內(nèi)存 (就像是到辦公室上班),或者被傳送到外部設(shè)備(好像去酒店休假),或者搬到別的房子中。在這樣的搬遷過程中,數(shù)據(jù)像是一個個排著隊走路的人流,我們叫它文本流(text stream,或者byte stream)。然而,計算機不同設(shè)備之間的連接方法差異很大,從內(nèi)存到文件的連接像是爬山,從內(nèi)存到外設(shè)像是游過一條河。為此,Linux還定義了流 (stream),以此作為修建連接各處的公路的標準。Stream的好處在于,無論你是從內(nèi)存到外設(shè),還是從內(nèi)存到文件,所有的公路都是相同的 (至于公路下面是石頭還是土地,都可以不用操心)。
我們再回味一下“everything is a stream of bytes”這句話。信息包含在文本流中,不斷在計算機的各個組件之間流動,不斷地接受計算機的加工,最終成為用戶所需要的某種服務(wù)。
(說句題外話,如果看過駭客帝國的話,一定會對文本流印象深刻。)
標準輸入,標準輸出,標準錯誤與重新定向
當Linux執(zhí)行一個程序的時候,會自動打開三個流,標準輸入(standard input),標準輸出(standard output),標準錯誤(standard error)。比如說你打開命令行的時候,默認情況下,命令行的標準輸入連接到鍵盤,標準輸出和標準錯誤都連接到屏幕。對于一個程序來說,盡管它總會打開這三個流,但它會根據(jù)需要使用,并不是一定要使用。
想象一下敲擊一個
有另一個符號:
echo的作用是將文本流導向標準輸出。在這里,echo的作用就是將IamVamei輸出到屏幕上。如果是
我們也可以用符號來改變標準輸入。比如cat命令,它可以從標準輸入讀入文本流,并輸出到標準輸出:
我們還可以使用>來同時重新定向標準輸出和標準錯誤。假設(shè)我們并沒有一個目錄void。那么
如果只想重新定向標準錯誤,可以使用2>:
管道 (pipe)
理解了以上的內(nèi)容之后,管道的概念就易如反掌。管道可以將一個命令的輸出導向另一個命令的輸入,從而讓兩個(或者更多命令)像流水線一樣連續(xù)工作,不斷地處理文本流。在命令行中,我們用|表示管道:
wc命令代表word count,用于統(tǒng)計文本中的行、詞以及字符的總數(shù)。a.txt中的文本先流到cat,然后從cat的標準輸出流到wc的標準輸入,從而讓wc知道自己要處理的是a.txt這個字符串。
Linux的各個命令實際上高度專業(yè)化,并盡量相互獨立。每一個都只專注于一個小的功能。但通過pipe,我們可以將這些功能合在一起,實現(xiàn)一些復雜的目的。
總結(jié)
文本流,標準輸入,標準輸出,標準錯誤
cat, echo, wc
>, >>, , |
下一篇:Linux命令和命令行詳解