Terminal

>/dev/null 2>&1 & 和 </dev/null &>/dev/null & 之間的區別

  • January 6, 2022

我一直在使用以下從終端啟動程序:

program_name &gt;/dev/null 2&gt;&1 &

但是最近我遇到了這個網頁,推薦了以下方法:

program_name &lt;/dev/null &&gt;/dev/null &

現在,我知道第一個是什麼意思了。這意味著將stderr 指向stdout 並將stdout 指向/dev/null,即stderr 和stdout 現在都指向null。

但是第二個是什麼意思?哪一個更適合從終端無頭啟動程序?

預設情況下,執行程序時會打開三個“標準”文件,即標準輸入 ( stdin)、標準輸出 ( stdout) 和標準錯誤 ( stderr)。在 Unix 中,它們與“文件描述符”(stdin= 0、stdout= 1、stderr= 2)相關聯。預設情況下,所有這三個都與控制終端的設備相關聯(通過該界面您可以在螢幕上看到內容並在程序中輸入輸入)。

Shell 使您能夠“重定向”文件描述符。&gt;操作員重定向輸出;&lt;重定向輸入。

例如:

program_name &gt; /dev/null

這相當於:

program_name 1&gt; /dev/null

將輸出重定向到文件描述符 1 (‘stdout’) 到 `/dev/null’

同樣,

program_name 2&gt; /dev/null

將輸出重定向到文件描述符 2 (‘stderr’) 到 ‘/dev/null’

您可能希望將兩者都 stdout重定向stderr到單個文件,因此您可能認為您會這樣做:

program_name &gt; /dev/null 2&gt; /dev/null

但這並不能處理對文件描述符的交錯寫入(這背後的細節是一個不同的問題)。要解決此問題,您可以執行以下操作:

program_name &gt; /dev/null 2&gt;&1

其中說“將寫入文件描述符1/dev/null重定向到文件描述符2並將寫入文件描述符2重定向到與文件描述符1寫入相同的位置”。這處理對文件描述符的交錯寫入。

該選項非常常見,以至於一些 shell 包含一個更短且功能等效的速記:

program_name &&gt; /dev/null

最後,您可以像重定向輸出一樣重定向輸入:

program_name &lt; /dev/null

將從 重定向文件描述符 0 ( stdin) /dev/null,因此如果程序嘗試讀取輸入,它將獲得 EOF。

把所有這些放在一起:

program_name &lt;/dev/null &&gt;/dev/null &

假設(1)執行,(2)從(program_name)重定向標準輸入,(3)將文件描述符1和2(和)都重定向到(),以及(4)在後台執行程序()。/dev/null``&lt;/dev/null``stdout``stderr``/dev/null``&&gt;/dev/null``&

引用自:https://unix.stackexchange.com/questions/497207