linux,shell,text,stream Linux文本流

Linux文本流

 

做者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!html

 

文件用於數據的存儲,至關於一個個存儲數據的房子。咱們以前說,所謂的數據是0或者1的序列,但嚴格來講,Linux以字節(byte)來做爲數據的單位,也就是說這個序列每八位(bit)爲一個單位(八位二進制對應的十進制範圍爲0到255)。使用ASCII編碼,能夠將這樣一個字節轉換成爲字符。因此,在Linux中,咱們所說的數據,徹底能夠用字符表達出來,也就是說文本(text)的形式。linux

實際上,若是以bit爲單位處理字符的話,機器會更容易讀懂和傳輸,效率會更高。但爲何Linux依然以字節爲單位進行處理呢?緣由在於,相對於以bit爲單位處理數據,以byte爲單位能夠更容易將數據轉化爲字符。相對於枯燥的0和1,字符更容易被人讀懂 (human readable)。然而,並非全部的數據都是設計來讓人讀懂的,好比可執行文件包含的各類字符對於人來講並無什麼意義 (由於可執行文件是爲了讓機器讀懂的)。但Linux依然以字節爲單位處理全部文件,這是爲了讓全部文件可以共用一套接口 (virtual file system),從而減小Linux設計的複雜度。post

("everything is a file"是一般所流傳的UNIX設計的哲學之一,但Linus對此做出糾正,改成"everything is a stream of bytes"。)編碼

然而,數據不是在找到了本身的房子(file)以後就永遠的定居下來。它每每要被讀入到內存 (就像是到辦公室上班),或者被傳送到外部設備(好像去酒店休假),或者搬到別的房子中。在這樣的搬遷過程當中,數據像是一個個排着隊走路的人流,咱們叫它文本流(text stream,或者byte stream)。然而,計算機不一樣設備之間的鏈接方法差別很大,從內存到文件的鏈接像是登山,從內存到外設像是遊過一條河。爲此,Linux還定義了流 (stream),以此做爲修建鏈接各處的公路的標準。Stream的好處在於,不管你是從內存到外設,仍是從內存到文件,全部的公路都是相同的 (至於公路下面是石頭仍是土地,均可以不用操心)。url

咱們再回味一下「everything is a stream of bytes」這句話。信息包含在文本流中,不斷在計算機的各個組件之間流動,不斷地接受計算機的加工,最終成爲用戶所須要的某種服務。spa

(說句題外話,若是看過駭客帝國的話,必定會對文本流印象深入。).net

 

2. 標準輸入,標準輸出,標準錯誤與從新定向命令行

當Linux執行一個程序的時候,會自動打開三個流,標準輸入(standard input),標準輸出(standard output),標準錯誤(standard error)。好比說你打開命令行的時候,默認狀況下,命令行的標準輸入鏈接到鍵盤,標準輸出和標準錯誤都鏈接到屏幕。對於一個程序來講,儘管它總會打開這三個流,但它會根據須要使用,並非必定要使用。設計

想象一下敲擊一個htm

$ls

鍵盤敲擊的文本流("ls\n",\n是回車時輸入的字符,表示換行)命令行 (命令行實際上也是一個程序)。命令行隨後調用/bin/ls獲得結果("a.txt"),最後這個輸出的文本流("a.txt")流到屏幕,顯示出來,好比說:

a.txt

假設說咱們不想讓文本流流到屏幕,而是流到另外一個文件,咱們能夠採用從新定向(redirect)的機制。

$ls > a.txt

從新定向標準輸出。這裏的>就是提醒命令行,讓它知道我如今想變換文本流的方向了,咱們不讓標準輸出輸出到屏幕,而是要到a.txt這個文件 (好像火車軌道換軌)。此時,計算機會新建一個a.txt的文件,並將命令行的標準輸出指向這個文件。

有另外一個符號:

$ls >> a.txt

這裏>>的做用也是從新定向標準輸出。若是a.txt已經存在的話,ls產生的文本流會附加在a.txt的結尾,而不會像>那樣每次都新建a.txt。

 

咱們下面介紹命令echo:

$echo IamVamei

echo的做用是將文本流導向標準輸出。在這裏,echo的做用就是將IamVamei輸出到屏幕上。若是是

$echo IamVamei > a.txt

a.txt中就會有IamVamei這個文本。

 

咱們也能夠用<符號來改變標準輸入。好比cat命令,它能夠從標準輸入讀入文本流並輸出到標準輸出:

$cat < a.txt

咱們將cat標準輸入指向a.txt,文本會從文件流到cat,而後再輸出到屏幕上。固然,咱們還能夠同時從新定向標準輸出:

$cat < a.txt > b.txt

這樣,a.txt的內容就複製到了b.txt中。

 

咱們還可使用>&來同時從新定向標準輸出和標準錯誤。假設咱們並無一個目錄void。那麼

$cd void > a.txt

會在屏幕上返回錯誤信息。由於此時標準錯誤依然指向屏幕。當咱們使用:

$cd void >& a.txt

錯誤信息被導向a.txt。

 

若是隻想從新定向標準錯誤,可使用2>:

$cd void 2> a.txt > b.txt

標準錯誤對應的老是2號,因此有以上寫法。標準錯誤輸出到a.txt,標準輸出輸出到b.txt。

 

3. 管道 (pipe)

理解了以上的內容以後,管道的概念就易如反掌。管道能夠將一個命令的輸出導向另外一個命令的輸入,從而讓兩個(或者更多命令)像流水線同樣連續工做,不斷地處理文本流。在命令行中,咱們用|表示管道:

$cat < a.txt | wc 

wc命令表明word count,用於統計文本中的以及字符的總數。a.txt中的文本先流到cat,而後從cat的標準輸出流到wc的標準輸入,從而讓wc知道本身要處理的是a.txt這個字符串。

 

Linux的各個命令實際上高度專業化,並儘可能相互獨立。每個都只專一於一個小的功能。但經過pipe,咱們能夠將這些功能合在一塊兒,實現一些複雜的目的。

 

總結:

文本流,標準輸入,標準輸出,標準錯誤

cat, echo, wc

>, >>, <, |

相關文章
相關標籤/搜索