學習bash——數據流重定向
一、概述
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——數據流重定向