1. 程式人生 > >nohup /dev/null 2>&1 含義詳解

nohup /dev/null 2>&1 含義詳解

為何2>&1要寫在後面?
command > file 2>&1 
首先是command > file將標準輸出重定向到file中, 2>&1 是標準錯誤拷貝了標準輸出的行為,也就是同樣被重定向到file中,最終結果就是標準輸出和錯誤都被重定向到file中。 
command 2>&1 >file 
2>&1 標準錯誤拷貝了標準輸出的行為,但此時標準輸出還是在終端。>file 後輸出才被重定向到file,但標準錯誤仍然保持在終端。

用strace可以看到: 
1. command > file 2>&1 

這個命令中實現重定向的關鍵系統呼叫序列是: 
open(file) == 3 
dup2(3,1) 
dup2(1,2) 

2. command 2>&1 >file 
這個命令中實現重定向的關鍵系統呼叫序列是: 
dup2(1,2) 
open(file) == 3 
dup2(3,1) 

為什麼要用 /dev/null 2>&1 這樣的寫法.這條命令的意思是將標準輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有資訊丟棄.下面我就為大家來說一下, command > file 2>file   與command > file 2>&1
 有什麼不同的地方.
首先~command > file 2>file 的意思是將命令所產生的標準輸出資訊,和錯誤的輸出資訊送到file 中.command   > file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會被開啟兩次,這樣stdout和stderr會互相覆蓋,這樣寫相當使用了FD1和FD2兩個同時去搶佔file 的管道.
command >file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道後,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容.

從IO效率上,前一條命令的效率要比後面一條的命令效率要低,所以在編寫shell指令碼的時候,較多的時候我們會用command > file 2>&1 這樣的寫法.