Linux文本流和標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤與重定向介紹

文本流
文件用于數(shù)據(jù)的存儲(chǔ),相當(dāng)于一個(gè)個(gè)存儲(chǔ)數(shù)據(jù)的房子。我們之前說(shuō),所謂的數(shù)據(jù)是0或者1的序列,但嚴(yán)格來(lái)說(shuō),Linux以字節(jié)(byte)來(lái)作為數(shù)據(jù)的單位,也就是說(shuō)這個(gè)序列每八位(bit)為一個(gè)單位(八位二進(jìn)制對(duì)應(yīng)的十進(jìn)制范圍為0到255)。使用ASCII編碼,可以將這樣一個(gè)字節(jié)轉(zhuǎn)換成為字符。所以,在Linux中,我們所說(shuō)的數(shù)據(jù),完全可以用字符表達(dá)出來(lái),也就是說(shuō)文本(text)的形式。
實(shí)際上,如果以bit為單位處理字符的話,機(jī)器會(huì)更容易讀懂和傳輸,效率會(huì)更高。但為什么Linux依然以字節(jié)為單位進(jìn)行處理呢?原因在于,相對(duì)于以bit為單位處理數(shù)據(jù),以byte為單位可以更容易將數(shù)據(jù)轉(zhuǎn)化為字符。相對(duì)于枯燥的0和1,字符更容易被人讀懂 (human readable)。然而,并不是所有的數(shù)據(jù)都是設(shè)計(jì)來(lái)讓人讀懂的,比如可執(zhí)行文件包含的各種字符對(duì)于人來(lái)說(shuō)并沒(méi)有什么意義 (因?yàn)榭蓤?zhí)行文件是為了讓機(jī)器讀懂的)。但Linux依然以字節(jié)為單位處理所有文件,這是為了讓所有文件能夠共用一套接口 (virtual file system),從而減少Linux設(shè)計(jì)的復(fù)雜度。
("everything is a file"是通常所流傳的UNIX設(shè)計(jì)的哲學(xué)之一,但Linus對(duì)此作出糾正,改為"everything is a stream of bytes"。)
然而,數(shù)據(jù)不是在找到了自己的房子(file)之后就永遠(yuǎn)的定居下來(lái)。它往往要被讀入到內(nèi)存 (就像是到辦公室上班),或者被傳送到外部設(shè)備(好像去酒店休假),或者搬到別的房子中。在這樣的搬遷過(guò)程中,數(shù)據(jù)像是一個(gè)個(gè)排著隊(duì)走路的人流,我們叫它文本流(text stream,或者byte stream)。然而,計(jì)算機(jī)不同設(shè)備之間的連接方法差異很大,從內(nèi)存到文件的連接像是爬山,從內(nèi)存到外設(shè)像是游過(guò)一條河。為此,Linux還定義了流 (stream),以此作為修建連接各處的公路的標(biāo)準(zhǔn)。Stream的好處在于,無(wú)論你是從內(nèi)存到外設(shè),還是從內(nèi)存到文件,所有的公路都是相同的 (至于公路下面是石頭還是土地,都可以不用操心)。
我們?cè)倩匚兑幌?ldquo;everything is a stream of bytes”這句話。信息包含在文本流中,不斷在計(jì)算機(jī)的各個(gè)組件之間流動(dòng),不斷地接受計(jì)算機(jī)的加工,最終成為用戶所需要的某種服務(wù)。
(說(shuō)句題外話,如果看過(guò)駭客帝國(guó)的話,一定會(huì)對(duì)文本流印象深刻。)
標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤與重新定向
當(dāng)Linux執(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)輸入連接到鍵盤(pán),標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都連接到屏幕。對(duì)于一個(gè)程序來(lái)說(shuō),盡管它總會(huì)打開(kāi)這三個(gè)流,但它會(huì)根據(jù)需要使用,并不是一定要使用。
想象一下敲擊一個(gè)
$ls
鍵盤(pán)敲擊的文本流("ls\n",\n是回車(chē)時(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è)文件 (好像火車(chē)軌道換軌)。此時(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),所以有以上寫(xiě)法。標(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
>, >>, <, |
相關(guān)文章
Fedora Linux 42 穩(wěn)定版發(fā)布: 帶來(lái)大量新功能和軟件更新
Fedora 42昨日發(fā)布,這是 Red Hat 贊助開(kāi)發(fā)的杰出前沿 Linux 發(fā)行版的最新版,包含大量新功能和軟件更新,使其成為 2025 年上半年發(fā)布的一款出色的 Linux 操作系統(tǒng)之一,內(nèi)2025-04-16如何在Linux查看硬盤(pán)信息? 查看Linux硬盤(pán)大小類型和硬件信息的5種方法
使用Linux系統(tǒng)的過(guò)程中,查看和了解硬盤(pán)信息是非常重要的工作,尤其是對(duì)于系統(tǒng)管理員而言,那么在Linux系統(tǒng)中如何查看硬盤(pán)信息?以下是具體內(nèi)容介紹2025-03-12如何在 Linux 中查看 CPU 詳細(xì)信息? 3招輕松查看CPU型號(hào)、核心數(shù)和溫度
在日常運(yùn)維工作中,獲取 CPU 信息是系統(tǒng)運(yùn)維管理員常見(jiàn)的工作內(nèi)容,無(wú)論是為了性能調(diào)優(yōu)、硬件升級(jí)還是僅僅滿足好奇心2025-03-11什么是 Arch Linux? 獨(dú)樹(shù)一幟的Arch Linux發(fā)行版分析
Arch Linux是為簡(jiǎn)化,優(yōu)化,現(xiàn)代化,實(shí)用主義,用戶中心和多功能性而創(chuàng)建Linux發(fā)行版,究竟是什么讓 Arch 與眾不同?下面我們就來(lái)簡(jiǎn)要解讀2025-02-19如何在Linux環(huán)境下制作 Win11裝機(jī)U盤(pán)?
一直用的linux辦公,想要將筆記本電腦從 Linux 系統(tǒng)切換回 Windows 11,我們可以制作一個(gè)win11裝機(jī)u盤(pán),詳細(xì)如下2025-02-17Rsnapshot怎么用? 基于Rsync的強(qiáng)大Linux備份工具使用指南
Rsnapshot 不僅可以備份本地文件,還能通過(guò) SSH 備份遠(yuǎn)程文件,接下來(lái)詳細(xì)介紹如何安裝、配置和使用 Rsnapshot,包括創(chuàng)建每小時(shí)、每天、每周和每月的本地備份,以及如何進(jìn)2025-02-06Linux Kernel 6.13發(fā)布:附更新內(nèi)容及新特性解讀
Linux 內(nèi)核 6.13 正式發(fā)布,新版本引入了惰性搶占支持,簡(jiǎn)化內(nèi)核搶占邏輯,通過(guò)減少與調(diào)度器相關(guān)的調(diào)用次數(shù),讓內(nèi)核在運(yùn)行時(shí)表現(xiàn)更優(yōu),從而提高效率2025-01-23五大特性引領(lǐng)創(chuàng)新! 深度操作系統(tǒng) deepin 25 Preview預(yù)覽版發(fā)布
今日,深度操作系統(tǒng)正式推出deepin 25 Preview版本,該版本集成了五大核心特性:磐石系統(tǒng)、全新DDE、Treeland窗口合成器、AI For OS以及Distrobox子系統(tǒng)2025-01-18Linux Mint Xia 22.1重磅發(fā)布: 重要更新一覽
Beta 版 Linux Mint“Xia” 22.1 發(fā)布,新版本基于 Ubuntu 24.04,內(nèi)核版本為 Linux 6.8,這次更新帶來(lái)了諸多優(yōu)化和改進(jìn),進(jìn)一步鞏固了 Mint 在 Linux 桌面操作系統(tǒng)領(lǐng)域的2025-01-16LinuxMint怎么安裝? Linux Mint22下載安裝圖文教程
Linux Mint22發(fā)布以后,有很多新功能,很多朋友想要下載并安裝,該怎么操作呢?下面我們就來(lái)看看詳細(xì)安裝指南2025-01-16