詳細理解 > /dev/null 2>&1


0:表示鍵盤輸入(stdin)
1:表示標准輸出(stdout),系統默認是1
2:表示錯誤輸出(stderr)


"command >/dev/null 2>&1 &"  與 "command 1>/dev/null 2>&1 &"  的意思一樣


1) command:    表示shell命令或者為一個可執行程序
2) >:       表示重定向到哪里
3) /dev/null:  表示Linux的空設備文件
4) 2:      表示標准錯誤輸出
5) &1:     &表示等同於的意思,  2>&1表示2的輸出重定向於1
6) &:    表示后台執行,即這條指令執行在后台運行

 

1 >/dev/null:表示標准輸出重定向到空設備文件,也就是不輸出任何信息到終端,不顯示任何信息。
2>&1:表示標准錯誤輸出重定向等同於標准輸出,因為之前標准輸出已經重定向到了空設備文件,所以標准錯誤輸出也重定向到空設
件。


這條命令的意思就是在后台執行這個程序,並將錯誤輸出2重定向到標准輸出1,然后將標准輸出1全部放到/dev/null文件,也就是清空.
所以可以看出" > /dev/null 2>&1 "常用來避免shell命令或者程序等運行中有內容輸出。

 

重定向,例如 echo "Hello" > /root/1.txt

 

  • command > file 2>file
  • command > file 2>&1

 

相同點:上面兩個命令都可是實現將執行command后的,標准及錯誤輸出重定向到file文件中。

 

不同點: I/O效率上的差異
command 1>file 2>file 這樣的寫法,stdout和stderr都直接送到file中, file會被打開兩次,這樣stdout和stderr會互相覆蓋,這樣寫相當使用了FD1和FD2兩個同時去搶占file的管道。
command 1>file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道后,再被送往file,此時,file只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容。從I/O 效率上,前一條命令的效率要比后面一條的命令效率要低,所以在編寫shell腳本的時候,最多的時候我們會command 1>file 2>&1 這樣的寫法, 或 "command >file 2&1"

 

注意:

你要是寫成這樣:command >/dev/null 2>&1 &, 則第一個 > 的前面可以帶有空格;但是如果你寫成這樣: command 1>/dev/null 2>&1 &, 則第一個 > 的前面最好不帶有空格,不然1會被當成command的運行參數。 但第一個 > 的后面可帶也可不帶空格。   第二個 > 的左右均不能帶有任何空格。因此比較保險的方法是所有 > 的前后都不帶有空格,准沒錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM