>/dev/null 2>&1 & 和 </dev/null &>/dev/null & 之間的區別
我一直在使用以下從終端啟動程序:
program_name >/dev/null 2>&1 &
但是最近我遇到了這個網頁,推薦了以下方法:
program_name </dev/null &>/dev/null &
現在,我知道第一個是什麼意思了。這意味著將stderr 指向stdout 並將stdout 指向/dev/null,即stderr 和stdout 現在都指向null。
但是第二個是什麼意思?哪一個更適合從終端無頭啟動程序?
預設情況下,執行程序時會打開三個“標準”文件,即標準輸入 (
stdin
)、標準輸出 (stdout
) 和標準錯誤 (stderr
)。在 Unix 中,它們與“文件描述符”(stdin
= 0、stdout
= 1、stderr
= 2)相關聯。預設情況下,所有這三個都與控制終端的設備相關聯(通過該界面您可以在螢幕上看到內容並在程序中輸入輸入)。Shell 使您能夠“重定向”文件描述符。
>
操作員重定向輸出;<
重定向輸入。例如:
program_name > /dev/null
這相當於:
program_name 1> /dev/null
將輸出重定向到文件描述符 1 (‘stdout’) 到 `/dev/null’
同樣,
program_name 2> /dev/null
將輸出重定向到文件描述符 2 (‘stderr’) 到 ‘/dev/null’
您可能希望將兩者都
stdout
重定向stderr
到單個文件,因此您可能認為您會這樣做:program_name > /dev/null 2> /dev/null
但這並不能處理對文件描述符的交錯寫入(這背後的細節是一個不同的問題)。要解決此問題,您可以執行以下操作:
program_name > /dev/null 2>&1
其中說“將寫入文件描述符1
/dev/null
重定向到文件描述符2並將寫入文件描述符2重定向到與文件描述符1寫入相同的位置”。這處理對文件描述符的交錯寫入。該選項非常常見,以至於一些 shell 包含一個更短且功能等效的速記:
program_name &> /dev/null
最後,您可以像重定向輸出一樣重定向輸入:
program_name < /dev/null
將從 重定向文件描述符 0 (
stdin
)/dev/null
,因此如果程序嘗試讀取輸入,它將獲得 EOF。把所有這些放在一起:
program_name </dev/null &>/dev/null &
假設(1)執行,(2)從(
program_name
)重定向標準輸入,(3)將文件描述符1和2(和)都重定向到(),以及(4)在後台執行程序()。/dev/null``</dev/null``stdout``stderr``/dev/null``&>/dev/null``&