溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux文本流

發(fā)布時(shí)間:2020-08-10 23:39:02 來(lái)源:ITPUB博客 閱讀:138 作者:ii_chengzi 欄目:建站服務(wù)器

之前已經(jīng)用文本編輯器修改過(guò)文本?,F(xiàn)在,我們要深入理解所謂的“ 文本”。

文本流

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

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

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

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

(說(shuō)句題外話,如果看過(guò)駭客帝國(guó)的話,一定會(huì)對(duì)文本流印象深刻。)

 
標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤與重新定向

當(dāng)Unix執(zhí)行一個(gè)程序的時(shí)候,會(huì)自動(dòng)打開(kāi)三個(gè)流,標(biāo)準(zhǔn)輸入(standard input),標(biāo)準(zhǔn)輸出(standard output),標(biāo)準(zhǔn)錯(cuò)誤(standard error)。比如說(shuō)你打開(kāi)命令行的時(shí)候,默認(rèn)情況下,命令行的標(biāo)準(zhǔn)輸入連接到鍵盤,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都連接到屏幕。對(duì)于一個(gè)程序來(lái)說(shuō),盡管它總會(huì)打開(kāi)這三個(gè)流,但它會(huì)根據(jù)需要使用,并不是一定要使用。

想象一下敲擊一個(gè)

$ls

鍵盤敲擊的文本流("ls\n",\n是回車時(shí)輸入的字符,表示換行)命令行 (命令行實(shí)際上也是一個(gè)程序)。命令行隨后調(diào)用/bin/ls得到結(jié)果("a.txt"),最后這個(gè)輸出的文本流("a.txt")流到屏幕,顯示出來(lái),比如說(shuō):

a.txt

假設(shè)說(shuō)我們不想讓文本流流到屏幕,而是流到另一個(gè)文件,我們可以采用重新定向(redirect)的機(jī)制。

$ls > a.txt

重新定向標(biāo)準(zhǔn)輸出。這里的>就是提醒命令行,讓它知道我現(xiàn)在想變換文本流的方向了,我們不讓標(biāo)準(zhǔn)輸出輸出到屏幕,而是要到a.txt這個(gè)文件 (好像火車軌道換軌)。此時(shí),計(jì)算機(jī)會(huì)新建一個(gè)a.txt的文件,并將命令行的標(biāo)準(zhǔn)輸出指向這個(gè)文件。

有另一個(gè)符號(hào):

$ls >> a.txt

這里>>的作用也是重新定向標(biāo)準(zhǔn)輸出。如果a.txt已經(jīng)存在的話,ls產(chǎn)生的文本流會(huì)附加在a.txt的結(jié)尾,而不會(huì)像>那樣每次都新建a.txt。

 

我們下面介紹命令echo:

$echo IamVamei

echo的作用是將文本流導(dǎo)向標(biāo)準(zhǔn)輸出。在這里,echo的作用就是將IamVamei輸出到屏幕上。如果是

$echo IamVamei > a.txt

a.txt中就會(huì)有IamVamei這個(gè)文本。

 

我們也可以用<符號(hào)來(lái)改變標(biāo)準(zhǔn)輸入。比如cat命令,它可以從標(biāo)準(zhǔn)輸入讀入文本流,并輸出到標(biāo)準(zhǔn)輸出:

$cat < a.txt

我們將cat標(biāo)準(zhǔn)輸入指向a.txt,文本會(huì)從文件流到cat,然后再輸出到屏幕上。當(dāng)然,我們還可以同時(shí)重新定向標(biāo)準(zhǔn)輸出:

$cat < a.txt > b.txt

這樣,a.txt的內(nèi)容就復(fù)制到了b.txt中。

 

我們還可以使用>&來(lái)同時(shí)重新定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。假設(shè)我們并沒(méi)有一個(gè)目錄void。那么

$cd void > a.txt

會(huì)在屏幕上返回錯(cuò)誤信息。因?yàn)榇藭r(shí)標(biāo)準(zhǔn)錯(cuò)誤依然指向屏幕。當(dāng)我們使用:

$cd void >& a.txt

錯(cuò)誤信息被導(dǎo)向a.txt。

 

如果只想重新定向標(biāo)準(zhǔn)錯(cuò)誤,可以使用2>:

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

標(biāo)準(zhǔn)錯(cuò)誤對(duì)應(yīng)的總是2號(hào),所以有以上寫法。標(biāo)準(zhǔn)錯(cuò)誤輸出到a.txt,標(biāo)準(zhǔn)輸出輸出到b.txt。

 
管道 (pipe)

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

$cat < a.txt | wc

wc命令代表word count,用于統(tǒng)計(jì)文本中的行、詞以及字符的總數(shù)。a.txt中的文本先流到cat,然后從cat的標(biāo)準(zhǔn)輸出流到wc的標(biāo)準(zhǔn)輸入,從而讓wc知道自己要處理的是a.txt這個(gè)字符串。

 

Linux的各個(gè)命令實(shí)際上高度專業(yè)化,并盡量相互獨(dú)立。每一個(gè)都只專注于一個(gè)小的功能。但通過(guò)pipe,我們可以將這些功能合在一起,實(shí)現(xiàn)一些復(fù)雜的目的。

 
總結(jié)

文本流,標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤

cat, echo, wc

>, >>, <, |

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI