1. 程式人生 > >學習bash——數據流重定向

學習bash——數據流重定向

命令 font 我們 添加 strong 你在 不同 鍵盤 命令執行

一、概述

1. 數據流

定義:以規定順序被讀取一次的數據序列。

分類:標準輸入(stdin)、標準輸出(stdout)和標準錯誤輸出(stderr)。

  • 標準輸出:指的是命令執行所回傳的正確信息。
  • 標準錯誤輸出:指的是命令執行失敗後,所回傳的錯誤信息。

2. 文件描述符

定義:在形式上是一個非負整數。實際上,它是一個索引值,所有打開的文件都通過文件描述符引用。當程序打開一個現有文件或者創建一個新文件時,內核向進程返回一個文件描述符。按照慣例,unix系統shell把文件描述符0與進程的標準輸入關聯,文件描述符1與標準輸出關聯,文件描述符2與標準錯誤輸出關聯。

Linux 默認提供了三個特殊設備,用於終端的顯示和輸出。分別為:stdin

(標準輸入,對應於你在終端的輸入),stdout(標準輸出,對應於終端的輸出),stderr(標準錯誤輸出,對應於終端的輸出)。

文件描述符 設備文件 說明
0 /dev/stdin 標準輸入
1 /dev/stdout 標準輸出
2 /dev/stderr 標準錯誤

3. 重定向

重定向:重新定個方向轉到正確位置。即將標準輸出導向一個文件或追加到一個文件中。

重定向描述符:&是一個描述符,若1或2前不加&,會被當成一個普通文件。常見用法如下:

表達式含義
1>&2把標準輸出重定向到標準錯誤
2>&1把標準錯誤輸出重定向到標準輸出
&>filename把標準輸出和標準錯誤輸出都重定向到文件filename 中

二、正文

1. 三種數據流重定向

  • 標準輸入(stdin):代碼為0,使用0<或0<<,其中代碼0可以省略
  • 標準輸出(stdout):代碼為1,使用1>或1>>,其中代碼1可以省略
  • 標準錯誤輸出(stderr):代碼為2,使用2>或2>>

2. 標準輸出(stdout)重定向
我們知道Linux中,cat命令可以將文件內容輸出到屏幕
如下所示:

技術分享

我們可以使用>將輸出重定向到其他文件,如下所示:

技術分享

可以看到,使用>後,文件內容並沒有輸出到屏幕,而是輸出到了mytxt文件。

  • >>與>的區別是:>>會把輸出添加到文件的末尾;>會清空文件,然後將輸出寫入該文件。

3. 標準錯誤輸出(stderr)重定向
與標準輸出(stdout)重定向用法相同,只是將>和>>改為2>和2>>。
表示重定向的是錯誤信息。
一般用來將錯誤信息和正確信息分開。

4. 將標準輸出(stdout)和標準錯誤輸出(stderr)分別存入不同的文件中
用法:cat test.txt > stdout.txt 2> stderr.txt

評講:執行此命令後,錯誤信息都會跑到stderr.txt這個文件中,而正確信息會跑到stdout.txt文件中。屏幕上不顯示任何信息。

5. 標準輸出和標準錯誤輸出寫入同一個文件
使用&>可將stdout和stderr輸出到同一個文件,如下所示:

技術分享

另一種用法:cat test.txt > mytxt 2>&1

6. 丟棄錯誤信息
有時我們希望將錯誤信息直接丟棄,而不保存到任一文件中。
此時,可將輸出重定向到設備/dev/null。如下所示:

命令:cat mytxt 2> /dev/null

將錯誤信息吃掉,此時屏幕輸出的只有正確信息了。

7. 標準輸入(stdin)重定向
命令:cat > mytxt

評講:加入>在cat後,mytxt會被主動創建,而其內容則可以從鍵盤輸入。

如下所示:

技術分享

使用<可以將其他文件內容輸入到該文件(即將原本需要由鍵盤輸入的數據改由文件內容來替代),如下所示:

技術分享

使用<<,表示定義輸入結束符,
從鍵盤輸入時,輸入Ctrl+D,可結束進程。
還可以使用<<自定義結束符,如下所示:

技術分享

即:利用<<符號,我們可以終止一次輸入,而不必輸入[Ctrl]+D來結束,這對程序寫作很有幫助。

7. 為什麽要用數據流重定向
1)需要將屏幕信息保存下來的時候
2)不希望其他程序幹擾到當前程序的屏幕輸出
3)執行時一些已知的錯誤,我們可以用"2>/dev/null"丟掉
4)正確信息和錯誤信息需要分開輸出

學習bash——數據流重定向