初窺Linux 之 資料流重定向

2021-07-29 08:58:29 字數 3309 閱讀 2854

一、什麼是資料流重定向

在說資料流重定向之前,先來說說資料流的概念吧。資料流分為三種:標準輸入(stdin),標準輸出(stdout)和標準錯誤輸出(stderr)。

簡單來說,標準輸出指的是命令執行所回傳的正確資訊,而標準錯誤輸出指的是命令執行失敗後,所回傳的錯誤資訊。這些資訊預設是列印在螢幕上的。

那麼什麼時資料流重定向呢?從字面上理解就是改變資料流的流向,使之流向指定的檔案或裝置。例如,把執行命令所回傳的正確資訊(標準輸出資訊)流向乙個檔案,而將所回傳的錯誤資訊(標準錯誤輸出)流向別乙個檔案,並把這兩個檔案的資訊儲存下來,而在螢幕上不出現任何該命令執行所回傳的資訊。

二、資料流重定向的實現

1、資料流重寫向的分類

在linux中利用shell實現資料流重定向是非常簡單的,下面來介紹3種資料流的重定向。

1)標準輸入(stdin):**為0,使用《或者<<

2)標準輸出(stdout):**為1,使用》或者》

3)標準錯誤輸出(stderr):**為2,使用2>或者2>>

看到這裡,你可能還是很疑惑,那個**有什麼作用,《和《有什麼不同,>和》又有什麼不同?

2、**的作用

那個**是為了區分命令中所使用的不同的資料流而設定的,例如,0**的就是標準輸入。注意在預設情況下,>和》分別表示1>和1>>,

而《和《分別表示0《和0<

3、標準輸出資料流重定向詳解

在說輸入之前,我先跟大家說說輸出吧,一般使用例子都能讓人更容易明白一樣東西是怎麼樣使用的。所以請看下面的例子,在當前目錄下,已存在乙個名為streamtest.txt的文字件,我使用cat命令來進行測試,我們知道,cat命令會把文字檔案中的內容輸出到螢幕上來。請看下面的例子:

我們可以看到直接使用cat命令,streamtest.txt檔案的內容直接列印在螢幕上。

而第二條語句cat streamtest.txt > outfile1使用了資料流重定向,那麼這條語句是什麼意思呢?它的意思就是把由cat命令所產生的直接輸出到螢幕上的資訊輸出到檔案outfile1中,並儲存。而且你可以看到,原本應在螢幕上輸出的資訊並沒有輸出到螢幕上,因為它輸出到了檔案outfile1中。這樣你就應該能理解為什麼叫資料流重定向了吧。

值得 注意的是,如果outfile1檔案不存在於當前目錄下,系統則會自動建立這個檔案;如果這個檔案已經存在於當前目錄下,那麼系統就會先把這個檔案中的內容清空,然後再將資料寫入到該檔案,也就是說若以》輸出到乙個已存在的檔案,則這個檔案的內容將會被覆蓋。

那有沒有什麼方法能不讓檔案內容被覆蓋呢?當然就,那就是》,這也就是》與》的區別。其用法與》大同小異,如下圖:

同樣的,使用這個命令,如果outfile2不存在於當前目錄中,則系統會自動建立這個檔案,而如果這個檔案已經存在於當前目標下,則會把資料追加到該檔案的末尾。所以在圖中看到了兩份重複的內容。

注:因為在預設情況下,>和》分別表示1>和1>>,所以在命令中沒有用到1>和1>>,因為它們是等價的。

4、標準錯誤輸出資料流重定向詳解

標準錯誤輸出的使用和標準輸出的使用大同小異,在這裡不再贅述,其使用如下:

由於當前目標下不存在檔案teststream.txt,所以直接使用cat,則會在螢幕上輸出錯誤提示,當然我們也可以用資料流重定向2>來把它輸出到檔案errfile中,而不是輸出到螢幕上。因為》預設是**1,所以這裡需要寫成2>,系統才知道這個是標準錯誤輸入重定向,那現在你應該更深刻地理解到**的作用了吧。而2>>也是追加的作用。

通過上面的例子可以看到,我們可以利用資料流重定向把錯誤資訊和正確資訊分開。

5、標準輸入資料流重寫向詳解詳解

在標準輸入中,《代表將原來需要由鍵盤輸入的資料改由檔案內容來替代,《則代表結束輸入。例如:

利用cat來建立乙個簡單的檔案catfile1,如下圖所示:

如果當前目錄下不存在catfile1,則系統自動建立這個檔案,並由鍵盤向這個檔案寫入內容;若檔案已存在,則用輸入的內容覆蓋該檔案中的內容。而標準輸入重定向可以用檔案的內容來替代鍵盤輸入,其操作如下圖所示:

可以看到,它把catfile1的內容輸入到catfile2中,代替先前的鍵盤輸入。

值得 注意的是,在標準輸入重定向中《並不表示追加,而是表示結束輸入的意思,即作為乙個結束符。請看如下的例子:

之前的例子,都是使用ctrl+d來結束的,而這個例子,當你輸入「eof」時,自動退出了,當然這個結束符,你可以自己定義。這對寫程式是有一定的好處的。

三、把正確資訊與錯誤資訊寫入同乙個檔案中的方法

上面的例子,都是把正確和錯誤的資訊分別儲存在不同的檔案上的,那有沒有辦法把正確和錯誤的資訊都儲存在同乙個檔案中呢?當然有!請看下面的例子:

注意:上面第三行的命令是錯誤的,雖然它看看起來非常直觀。它的錯誤並不是因為語法之類的錯誤,也不是因為它不能執行,而是因為,有兩條資料流同時寫入乙個檔案,又沒有特殊的語法,此時會導致兩條資料流交叉地寫入檔案,造成次序的錯亂,而不是螢幕上原來輸出的排序,使檔案的資訊不可讀。

四、遮蔽所有資訊的方法

如果我有一定的目的,想把所有的錯誤資訊或正確資訊都遮蔽掉,可以怎麼辦呢?這時可以利用資料流重定向,使它流向乙個裝置——/dev/null,它就像乙個黑洞一樣,可以吃掉任何導向這個裝置的資訊。

請看下面的例子:

無論是正確的資訊還是錯誤的資訊,它都能吃掉。

五、何時使用資料流重定向

既然我們知道了資料流的重定向,那麼什麼時候要使用資料流重定向呢?資料流重定向一般應用於:

1、螢幕輸出的資訊很重要,而且我們需要將它儲存下來;

2、後台執行中的程式,不希望它干擾螢幕正常的輸出結果;

3、一些系統的例行命令的執行結果,希望它能夠儲存下來;

4、一些執行命令的可能已知出錯資訊時,想以「2>/dev/null」將它遮蔽掉;

5、錯誤資訊和正確資訊需要分別輸出;

初窺Linux 之 資料流重定向

一 什麼是資料流重定向 在說資料流重定向之前,先來說說資料流的概念吧。資料流分為三種 標準輸入 stdin 標準輸出 stdout 和標準錯誤輸出 stderr 簡單來說,標準輸出指的是命令執行所回傳的正確資訊,而標準錯誤輸出指的是命令執行失敗後,所回傳的錯誤資訊。這些資訊預設是列印在螢幕上的。那麼...

linux之資料流重定向

stdin 標準輸入,對應於你在終端的輸入 stdout 標準輸出,對應於終端的輸出 stderr 標準錯誤輸出,對應於終端的輸出 檔案描述符 裝置檔案 說明 0 dev stdin 標準輸入 1 dev stdout 標準輸出 2 dev stderr 標準錯誤檔案描述符 檔案描述符在形式上是乙個...

Linux資料流重定向

開篇 當在執行shell命令時,常見的就是輸出在螢幕上,但是我們有些時候需要儲存輸出結果或者丟棄輸出錯誤,就需要重定向了。什麼是資料流重定向 當我們執行乙個命令 命令不也是程式嘛 可能由檔案或者鍵盤讀入資料,經過處理之後,再將結果輸出到螢幕上。圖中,standard output與standard ...