文件描述符java
當執行shell命令時,會默認打開3個文件,每一個文件有對應的文件描述符來方便咱們使用:linux
類型 | 文件描述符 | 默認狀況 | 對應文件句柄位置 |
---|---|---|---|
標準輸入(standard input) | 0 | 從鍵盤得到輸入 | /proc/self/fd/0 |
標準輸出(standard output) | 1 | 輸出到屏幕(即控制檯) | /proc/self/fd/1 |
錯誤輸出(error output) | 2 | 輸出到屏幕(即控制檯) | /proc/self/fd/2 |
因此咱們平時在執行shell命令中,都默認是從鍵盤得到輸入,而且將結果輸出到控制檯上。可是咱們能夠經過更改文件描述符默認的指向,從而實現輸入輸出的重定向。好比咱們將1指向文件,那麼標準的輸出就會輸出到文件中。shell
輸出重定向.net
輸出重定向的使用方式很簡單,基本的一些命令以下:code
命令 | 介紹 |
---|---|
command >filename | 把標準輸出重定向到新文件中 |
command 1>filename | 同上 |
command >>filename | 把標準輸出追加到文件中 |
command 1>>filename | 同上 |
command 2>filename | 把標準錯誤重定向到新文件中 |
command 2>>filename | 把標準錯誤追加到新文件中 |
咱們使用>或者>>對輸出進行重定向。符號的左邊表示文件描述符,若是沒有的話表示1,也就是標準輸出,符號的右邊能夠是一個文件,也能夠是一個輸出設備。當使用>時,會判斷右邊的文件存不存在,若是存在的話就先刪除,而後建立一個新的文件,不存在的話則直接建立。可是當使用>>進行追加時,則不會刪除原來已經存在的文件。htm
重定向綁定get
好了,在有了以上知識的基礎上,咱們再來看開頭提到的>/dev/null 2>&1
。這條命令其實分爲兩命令,一個是>/dev/null
,另外一個是2>&1
。input
1. >/dev/nulltable
這條命令的做用是將標準輸出1重定向到/dev/null
中。 /dev/null
表明linux的空設備文件,全部往這個文件裏面寫入的內容都會丟失,俗稱「黑洞」。那麼執行了>/dev/null
以後,標準輸出就會再也不存在,沒有任何地方可以找到輸出的內容。後臺
2. 2>&1
這條命令用到了重定向綁定,採用&能夠將兩個輸出綁定在一塊兒。這條命令的做用是錯誤輸出將和標準輸出同用一個文件描述符,說人話就是錯誤輸出將會和標準輸出輸出到同一個地方。
linux在執行shell命令以前,就會肯定好全部的輸入輸出位置,而且從左到右依次執行重定向的命令,因此>/dev/null 2>&1
的做用就是讓標準輸出重定向到/dev/null
中(丟棄標準輸出),而後錯誤輸出因爲重用了標準輸出的描述符,因此錯誤輸出也被定向到了/dev/null
中,錯誤輸出一樣也被丟棄了。執行了這條命令以後,該條shell命令將不會輸出任何信息到控制檯,也不會有任何信息輸出到文件中。
nohup結合
咱們常常使用nohup command &
命令形式來啓動一些後臺程序,好比一些java服務:
# nohup java -jar xxxx.jar &
爲了避免讓一些執行信息輸出到前臺(控制檯),還會加上剛纔提到的>/dev/null 2>&1
命令來丟棄全部的輸出:
# nohup java -jar xxxx.jar >/dev/null 2>&1 &