前言
相信大家經(jīng)常能在shell腳本中發(fā)現(xiàn)>/dev/null 2>&1這樣的語句。以前的我并沒有去深入地理解這段命令的作用,照搬照用,直到上周我將這段命令不小心寫成了2>&1 >/dev/null,出了一點小問題之后,我才開始去了解這段命令背后的“玄機”。
shell重定向介紹
就像我們平時寫的程序一樣,一段程序會處理外部的輸入,然后將運算結(jié)果輸出到指定的位置。在交互式的程序中,輸入來自用戶的鍵盤和鼠標(biāo),結(jié)果輸出到用戶的屏幕,甚至播放設(shè)備中。而對于某些后臺運行的程序,輸入可能來自于外部的一些文件,運算的結(jié)果通常又寫到其他的文件中。而且程序在運行的過程中,會有一些關(guān)鍵性的信息,比如異常堆棧,外部接口調(diào)用情況等,這些都會統(tǒng)統(tǒng)寫到日志文件里。
shell腳本也一樣,但是我們一般在使用shell命令的時候,更多地還是通過鍵盤輸入,然后在屏幕上查看命令的執(zhí)行結(jié)果。如果某些情況下,我們需要將shell命令的執(zhí)行結(jié)果存儲到文件中,那么我們就需要使用輸入輸出的重定向功能。
文件描述符
當(dāng)執(zhí)行shell命令時,會默認(rèn)打開3個文件,每個文件有對應(yīng)的文件描述符來方便我們使用:
| 類型 | 文件描述符 | 默認(rèn)情況 | 對應(yīng)文件句柄位置 |
|---|---|---|---|
| 標(biāo)準(zhǔn)輸入(standard input) | 0 | 從鍵盤獲得輸入 | /proc/self/fd/0 |
| 標(biāo)準(zhǔn)輸出(standard output) | 1 | 輸出到屏幕(即控制臺) | /proc/self/fd/1 |
| 錯誤輸出(error output) | 2 | 輸出到屏幕(即控制臺) | /proc/self/fd/2 |
所以我們平時在執(zhí)行shell命令中,都默認(rèn)是從鍵盤獲得輸入,并且將結(jié)果輸出到控制臺上。但是我們可以通過更改文件描述符默認(rèn)的指向,從而實現(xiàn)輸入輸出的重定向。比如我們將1指向文件,那么標(biāo)準(zhǔn)的輸出就會輸出到文件中。
輸出重定向
輸出重定向的使用方式很簡單,基本的一些命令如下:
| 命令 | 介紹 |
|---|---|
| command >filename | 把標(biāo)準(zhǔn)輸出重定向到新文件中 |
| command 1>filename | 同上 |
| command >>filename | 把標(biāo)準(zhǔn)輸出追加到文件中 |
| command 1>>filename | 同上 |
| command 2>filename | 把標(biāo)準(zhǔn)錯誤重定向到新文件中 |
| command 2>>filename | 把標(biāo)準(zhǔn)錯誤追加到新文件中 |
新聞熱點
疑難解答