什麼是數據流?
數據流分三種,標準輸入流(stdin)、標準輸出流(stdout)、標準錯誤輸出流(stderr)
標準輸入流默認由鍵盤輸入產生,標準輸出流是執行命令時的輸出日誌,這些日誌包含正常的日誌輸出與命令掃行失敗的錯誤輸出,即標準輸出流與標準錯誤輸出流
什麼是數據流重定向?
將本應由鍵盤輸入或輸出到屏幕上的數據流重定向到文件或設備上(保存到文件或設備中),稱之爲數據流重定向
數據流重定向的作用(應用場景)
- 屏幕輸出信息需要保存
- 後臺執行程序,不想將日誌打在桌面上
- 區分輸出標準輸出與標準錯誤輸出處理時
- 丟棄已知錯誤信息,
2> /dev/null
數據流的代號與表現方式
- 標準輸入(stdin):代碼
0
,使用<
或<<
表示 - 標準輸出(stdout):代碼
1
,使用>
或>>
表示 - 標準錯誤輸出(stderr):代碼
2
,使用2>
或2>>
表示
>、>>、2>、2>> 區別
>
:以【覆蓋】的方式,將【正確的數據】輸出到文件或設備上>>
:以【追加】的方式,將【正確的數據】輸出到文件或設備上2>
:以【覆蓋】的方式,將【錯誤的數據】輸出到文件或設備上2>>
:以【追加】的方式,將【錯誤的數據】輸出到文件或設備上
黑洞 /dev/null
當需要將某些日誌不重要的數據流重定向走,但又不想保存文件佔用空間時,重定向數據流 /dev/null
設備上,相當於將數據丟入黑洞
示例:
將標準輸出丟入黑洞
$ cat /etc/profile > /dev/null
將標準錯誤輸出丟入黑洞
$ find / -name .bashrc 2> /dev/null
將stdout與stderr輸出到同一文件或設備
非root用戶沒有權限訪問其他用戶家目錄,會輸出錯誤日誌,以下例子由此產生錯誤信息
1、【反例】分別設置stdout與stderr到同一文件
$ find / -name .bashrc > /tmp/stdtestlogs1 2> /tmp/stdtestlogs1
輸入流交叉,會導致文件內容次序錯亂
2、【正例1】輸出兩者到同一文件,語法1 [command]> [file] 2>&1
$ find / -name .bashrc > /tmp/stdtestlogs2 2>&1
3、【正例2】輸出兩者到同一文件,語法2 [command] &> [file]
$ find / -name .bashrc &> /tmp/stdtestlogs3
4、將所有日誌輸入黑洞
$ find / -name .bashrc > /dev/null 2>&1
5、將錯誤日誌輸入黑洞
$ find / -name .bashrc 2> /dev/null
標準輸入流重定向 < 與 <<
即,將原本由鍵盤輸入的數據,改由文件內容提供
在標準輸入流重定向中,<
與 <<
作用不是覆蓋與追加了,<
表示使用文件提供數據,<<
用來【設置輸入結束的字符】
【例1】:將 ~/.bashrc
輸出重定向到 /tmp/stdintest
中
$ cat > /tmp/stdintest < ~/.bashrc
【例2】:設置【輸入結束字符】,將一段文字輸入到 /tmp/stdintest2
中
$ cat > /tmp/stdintest2 <<EOF
這是一條測試
這是一條測
這是一條
這是一
這是
這
EOF
總結自鳥哥私房菜第四版