Linux文字資料流

來源:互聯網
上載者:User

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

 

檔案用於資料的儲存,相當於一個個儲存資料的房子。我們之前說,所謂的資料是0或者1的序列,但嚴格來說,Linux以位元組(byte)來作為資料的單位,也就是說這個序列每八位(bit)為一個單位(八位二進位對應的十進位範圍為0到255)。使用ASCII編碼,可以將這樣一個位元組轉換成為字元。所以,在Linux中,我們所說的資料,完全可以用字元表達出來,也就是說文本(text)的形式。

實際上,如果以bit為單位處理字元的話,機器會更容易讀懂和傳輸,效率會更高。但為什麼Linux依然以位元組為單位進行處理呢?原因在於,相對於以bit為單位處理資料,以byte為單位可以更容易將資料轉化為字元。相對於枯燥的0和1,字元更容易被人讀懂 (human readable)。然而,並不是所有的資料都是設計來讓人讀懂的,比如可執行檔包含的各種字元對於人來說並沒有什麼意義 (因為可執行檔是為了讓機器讀懂的)。但Linux依然以位元組為單位處理所有檔案,這是為了讓所有檔案能夠共用一套介面 (virtual file system),從而減少Linux設計的複雜度。

("everything is a file"是通常所流傳的UNIX設計的哲學之一,但Linus對此作出糾正,改為"everything is a stream of bytes"。)

然而,資料不是在找到了自己的房子(file)之後就永遠的定居下來。它往往要被讀入到記憶體 (就像是到辦公室上班),或者被傳送到外部裝置(好像去酒店休假),或者搬到別的房子中。在這樣的搬遷過程中,資料像是一個個排著隊走路的人流,我們叫它文字資料流(text stream,或者byte stream)。然而,電腦不同裝置之間的串連方法差異很大,從記憶體到檔案的串連像是爬山,從記憶體到外設像是遊過一條河。為此,Linux還定義了流 (stream),以此作為修建串連各處的公路的標準。Stream的好處在於,無論你是從記憶體到外設,還是從記憶體到檔案,所有的公路都是相同的 (至於公路下面是石頭還是土地,都可以不用操心)。

我們再回味一下“everything is a stream of bytes”這句話。資訊包含在文字資料流中,不斷在電腦的各個組件之間流動,不斷地接受電腦的加工,最終成為使用者所需要的某種服務。

(說句題外話,如果看過駭客帝國的話,一定會對文字資料流印象深刻。)

 

2. 標準輸入,標準輸出,標準錯誤與重新定向

當Linux執行一個程式的時候,會自動開啟三個流,標準輸入(standard input),標準輸出(standard output),標準錯誤(standard error)。比如說你開啟命令列的時候,預設情況下,命令列的標準輸入串連到鍵盤,標準輸出和標準錯誤都串連到螢幕。對於一個程式來說,儘管它總會開啟這三個流,但它會根據需要使用,並不是一定要使用。

想象一下敲擊一個

$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

>, >>, <, |

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.