中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux文本流

發布時間:2020-08-10 23:39:02 來源:ITPUB博客 閱讀:145 作者:ii_chengzi 欄目:建站服務器

之前已經用文本編輯器修改過文本。現在,我們要深入理解所謂的“ 文本”。

文本流

在計算機中,所謂的數據就是0或1的二進制序列,但嚴格來說,Unix以字節(byte)來作為數據的單位,也就是說這個序列每八位(bit)為一個單位。八位的二進制數字,會落在十進制從0到255的范圍內。利用ASCII編碼,可以把這一個字節轉換成為256個字符中的一個。所以,在Unix中,數據完全可以用字符的形式表示出來,也就是所謂的文本(text)。

實際上,如果以位為單位的話,機器會更容易讀懂和傳輸。但Unix系統堅持用字節為單位來表示數據。原因在于,相對于以位為單位的二進制數據,以字節為單位文本直接就人類可讀(human readable)。這樣的話,無論是計算機配置信息,還是別人寫的一首詩,用戶都可以直接讀懂。當然,并不是所有的數據都是設計來讓人讀懂的。很多編譯好的可執行文件中包含的內容,只有機器能讀懂。打開這個文件,盡管也能看到一個個字符,但這些字符并不能組成什么有意義的文本。但Unix系統不會給這種“讀不懂”的文件開后門。所有文件都是統一的形式,就能以相同的方法存儲,也能共用一套處理工具,從而減少程序開發的難度。

存儲文本的文件,就相當于一個個存儲數據的房子。在Unix的設計哲學中,一向有“萬物皆文件”(Everything is a file)的說法。大部分的文件都對應了存儲設備,也就是樹莓派的SD卡上的信息。就連表示文件位置的目錄,也是一種文件。此外,程序的配置信息,也都存儲在文件中。對于Unix系統來說,文件可以廣義的認為是可以提供或接收數據的對象。既然這樣,Unix系統干脆把提供或接收數據的硬件也表示成文件。這其中,既有外部連接的USB設備,也包括樹莓派內部的內存等硬件。在/dev目錄下,就可以找到很多這樣代表硬件的文件。

但托瓦茲對“萬物皆文件”的說法作出過糾正,改為“萬物皆文本流”(Everything is a stream of bytes")。系統運行時,數據并不是在一個文件里定居。數據會在CPU的指揮下不斷地流動,就好像一個勤勞的上班族。有時數據需要到辦公室上班,因此被讀入到內存,有時會去酒店休假,傳送到外部設備。有的時候,數據需要搬個家,轉移到另一個文件。在這樣跑來跑去的過程中,數據像是排著隊走路的人流,我們叫它文本流(text stream,或者byte stream)。然而,計算機不同設備之間的連接方法差異很大,從內存到文件的連接像是爬山,從內存到外設像是游過一條河。為此,Unix定義了流 (stream),作為連接操作系統各處的公路標準。有了“流”,無論是從內存到外設,還是從內存到文件,所有的數據公路都是相同的格式。至于公路下面是石頭還是土地,就都交給操作系統處理,不勞用戶操心。

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

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

當Unix執行一個程序的時候,會自動打開三個流,標準輸入(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。

 
管道 (pipe)

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

$cat < a.txt | wc

wc命令代表word count,用于統計文本中的行、詞以及字符的總數。a.txt中的文本先流到cat,然后從cat的標準輸出流到wc的標準輸入,從而讓wc知道自己要處理的是a.txt這個字符串。

 

Linux的各個命令實際上高度專業化,并盡量相互獨立。每一個都只專注于一個小的功能。但通過pipe,我們可以將這些功能合在一起,實現一些復雜的目的。

 
總結

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

cat, echo, wc

>, >>, <, |

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

赤峰市| 东乡族自治县| 永胜县| 慈利县| 双江| 靖安县| 沧州市| 望都县| 井研县| 宜都市| 吴桥县| 海原县| 韶关市| 胶南市| 扎鲁特旗| 柞水县| 博爱县| 临猗县| 日喀则市| 青州市| 新竹市| 东宁县| 新密市| 大厂| 海兴县| 法库县| 桦南县| 兰考县| 嘉祥县| 高唐县| 南阳市| 武城县| 鄂尔多斯市| 嵊泗县| 虹口区| 高雄市| 那曲县| 衡山县| 新河县| 铜梁县| 定南县|