更加深入理解Linux文本流
文本流
文件用於數據的存儲,相當於一個個存儲數據的房子。我們之前説,所謂的數據是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”這句話。信息包含在文本流中,不斷在計算機的各個組件之間流動,不斷地接受計算機的加工,最終成為用户所需要的某種服務。
(説句題外話,如果看過駭客帝國的話,一定會對文本流印象深刻。)
標準輸入,標準輸出,標準錯誤與重新定向
當Linux執行一個程序的時候,會自動打開三個流,標準輸入(standard input),標準輸出(standard output),標準錯誤(standard error)。比如説你打開命令行的時候,默認情況下,命令行的標準輸入連接到鍵盤,標準輸出和標準錯誤都連接到屏幕。對於一個程序來説,儘管它總會打開這三個流,但它會根據需要使用,並不是一定要使用。
想象一下敲擊一個
代碼如下:
$ls
鍵盤敲擊的文本流(“ls”,是回車時輸入的字符,表示換行)命令行 (命令行實際上也是一個程序)。命令行隨後調用/bin/ls得到結果(“”),最後這個輸出的`文本流(“”)流到屏幕,顯示出來,比如説:
代碼如下:
假設説我們不想讓文本流流到屏幕,而是流到另一個文件,我們可以採用重新定向(redirect)的機制。
代碼如下:
$ls 》
重新定向標準輸出。這裏的》就是提醒命令行,讓它知道我現在想變換文本流的方向了,我們不讓標準輸出輸出到屏幕,而是要到這個文件 (好像火車軌道換軌)。此時,計算機會新建一個的文件,並將命令行的標準輸出指向這個文件。
有另一個符號:
代碼如下:
$ls 》》
這裏》》的作用也是重新定向標準輸出。如果已經存在的話,ls產生的文本流會附加在的結尾,而不會像》那樣每次都新建。
我們下面介紹命令echo:
代碼如下:
$echo IamVamei
echo的作用是將文本流導向標準輸出。在這裏,echo的作用就是將IamVamei輸出到屏幕上。如果是
代碼如下:
$echo IamVamei 》
中就會有IamVamei這個文本。
我們也可以用《符號來改變標準輸入。比如cat命令,它可以從標準輸入讀入文本流,並輸出到標準輸出:
代碼如下:
$cat 《
我們將cat標準輸入指向,文本會從文件流到cat,然後再輸出到屏幕上。當然,我們還可以同時重新定向標準輸出:
代碼如下:
$cat 《 》
這樣,的內容就複製到了中。
我們還可以使用》&來同時重新定向標準輸出和標準錯誤。假設我們並沒有一個目錄void。那麼
代碼如下:
$cd void 》
會在屏幕上返回錯誤信息。因為此時標準錯誤依然指向屏幕。當我們使用:
代碼如下:
$cd void 》&
錯誤信息被導向。
如果只想重新定向標準錯誤,可以使用2》:
代碼如下:
$cd void 2》 》
標準錯誤對應的總是2號,所以有以上寫法。標準錯誤輸出到,標準輸出輸出到。
管道 (pipe)
理解了以上的內容之後,管道的概念就易如反掌。管道可以將一個命令的輸出導向另一個命令的輸入,從而讓兩個(或者更多命令)像流水線一樣連續工作,不斷地處理文本流。在命令行中,我們用|表示管道:
代碼如下:
$cat 《 | wc
wc命令代表word count,用於統計文本中的行、詞以及字符的總數。中的文本先流到cat,然後從cat的標準輸出流到wc的標準輸入,從而讓wc知道自己要處理的是這個字符串。
Linux的各個命令實際上高度專業化,並儘量相互獨立。每一個都只專注於一個小的功能。但通過pipe,我們可以將這些功能合在一起,實現一些複雜的目的。
總結
文本流,標準輸入,標準輸出,標準錯誤
cat, echo, wc
》, 》》, 《, |
上面就是Linux文本流的詳細介紹了,本文主要介紹了標準輸入、標準輸出、標準錯誤和重定向,那麼你對Linux文本流有一定的瞭解了嗎?
-
如何解決win7系統svchost.exe一直佔用網速
電腦很卡?那可能是你使用的win7系統裏面的一直在佔用你的網速導致的,以下是小編為大家搜索整理的如何解決win7系統一直佔用網速,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!1、是一個屬於微軟Windows操作系統的系統程序,微軟官方對它的解...
-
操作系統讀書工程報告範文
篇一:操作系統讀書工程報告一、基本理論闡述1.進程定義:進程是一個具有一定獨立功能的程序關於某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。基本介紹:多道程序在執行時,需要共享系統...
-
解讀重定向linux命令應用及語法
解讀重定向linux命令應用及語法1.標準輸入的控制語法:命令文件將命令的執行結果送至指定的文件中。例如:ls-l>list將執行“ls-l”命令的結果寫入文件list中。語法:命令>!文件將命令的執行結果送至指定的文件中,若文件已經存在,則覆蓋。例如:ls-lg>!list將執行“ls-l...
-
Windows10系統刪除Windows憑據實現方法
導語:Win10系統下的.憑據管理器是用來管理Web憑據以及Windows憑據的一個系統組件,進行維護工作時有時我們需要刪除Windows憑據,那麼如何進行操作實現呢?下面是小編給大家提供的Windows10系統刪除Windows憑據實現方法,大家可以參考閲讀,更多詳情請關注應屆畢業生考試...