本篇講述linux系統的輸入輸出、管道和重定向。
1. liunx的輸入輸出
一個linux系統要想發揮作用,就要有輸入輸出,這樣才可以與外界交互。
類型 | 設備文件名 | 文件描述符 | 設備名稱 | 說明 | 備注 |
標准輸入 | /dev/stdin | 0 | 鍵盤 | 程序默認的輸入設備 | |
標准輸出 | /dev/stdout | 1 | 當前屏幕 | 程序默認的輸出設備 | |
標准錯誤輸出 | /dev/stderr | 2 | 當前屏幕 | 程序默認的錯誤信息輸出設備 |
2. 輸入輸出的重定向
有些情況,比如我想把程序的日志輸出保存起來,以便后續查看。默認輸出是屏幕,而屏幕是有大小的,超了顯示的區域之前的日志就不可看了。這時就需要重新定義它的輸出位置,就有了重定向。
很容易理解,有輸出重定向,就有輸入重定向。那么輸入輸出的重定向怎么定義呢?請看下表:
類型 | 操作符 | 例子 | 說明 |
輸入重定向 | < | tac < 123.txt | 把123.txt里的內容輸入到tac命令,不需要再從鍵盤接受字符 |
標准輸出重定向 | > | ls / > 123.log | 把ls / 的輸出重定向到123.log文件中,123.log不存在則創建,123.log存在則內容覆蓋 |
標准錯誤輸出重定向 | 2> | ls /error 2> 123.log | 把ls /error的錯誤輸出重定向到123.log文件中,123.log不存在則創建,123.log存在則內容覆蓋 |
輸出重定向合並 | &>或者2>&1 | ls / /error &> 123.log | 把ls / /error的標准輸出和標准錯誤輸出都重定向到123.log文件中,123.log不存在則創建,123.log存在則內容覆蓋 |
追加 | >> | 把上述>變成>>,文件存在則追加到末尾,避免上述文件存在被覆蓋的情況 |
補充說明一下:
合並重定向的2>&1這種方式,看下面的例子:
發現把2>&1放置在前面的話,錯誤輸出並沒有保存到456.log中,而還是打印在屏幕上。把2>&1放置在后面的話,錯誤輸出就保存到123.log中,而沒有打印在屏幕上。這是為什么呢?
解答:2>&1,它是把錯誤輸出重定向為標准輸出。位置不同邏輯順序就不同。
放置在前面的話,就先把2轉成1,而1默認是在屏幕上顯示的,然后再定義1保存到文件中,而這時2已經轉化為1在屏幕中輸出過了。
放置在后面的話,就先定義1保存到文件中,然后把2變成1,而此時1已經定義重定向到文件中了。
3. 管道
管道是linux中一個重要的概念,在linux中用“|”表示,他可以把前一個命令的輸出結果當成下一個命令的輸入,經過組合,可以方便的得出我們想要的結果。
比如,我想查找/tmp目錄下3分鍾之內創建的名字包含“abc”的文件或目錄,則可以用:
它就把find出來的結果當成grep的輸入了。
這里也補充說明一下:管道只能接受標准輸出,而不能接受標准錯誤輸出。如下: