Stdout

程序的輸出、標準輸出和它的文件描述符之間是什麼關係?

  • January 25, 2014

讓我們假設我正在執行wget它正在下載一些東西。它正在向我的終端列印一些文本並將下載的數據寫入文件。

從術語的角度來看,下載的文件和控制台中出現的資訊有什麼區別?這取決於我們將某些東西視為“標準輸出”而不是“輸出”?

誰/什麼決定是否可以通過/proc/self/fd/1或通過其他方式(文件系統中的文件、GUI 程序的視窗等)訪問某些輸出?

有標準輸出 (1)、錯誤輸出 (2) 和輸入 (0)。這些是標准文件描述符:

tweedleburg:~ $ cat &
[1] 13089

[1]+  Stopped                 cat
tweedleburg:~ $ cd /proc/$!
tweedleburg:/proc/13089 $ cd fd
tweedleburg:/proc/13089/fd $ ls
0  1  2

現在程序員可以打開文件,每次打開文件都會提供一個文件描述符(更多資訊http://linux.die.net/man/2/open)。現在讓我們看看這個:

tweedleburg:~ $ wget www.linuxintro.org
[...]
2014-01-25 20:43:30 (157 KB/s) - ‘index.html’ saved [19928]

在這裡,wget 程序員決定打開一個文件(在本例中為 index.html)進行寫入。它有一些數字作為文件描述符,但肯定不是 0、1 或 2。來自網際網路的數據被寫入其中。wget 的程序員還決定將“已保存”行寫入錯誤輸出流。我可以理解為 wget 擁有或可能獲得將所有數據轉儲到標準輸出流的參數。那麼它一定不能和狀態資訊混在一起。

這就是為什麼有兩個輸出流,用於數據的標準輸出和用於錯誤/狀態消息的錯誤輸出。我在這裡寫部落格:http ://www.linuxintro.org/wiki/Stdout,_stderr_and_stdin 。

現在要重定向錯誤輸出,您使用 2> 運算符,對於標準輸出,您使用 1> 或 > 運算符:

tweedleburg:~ $ wget >/dev/null
wget: missing URL
Usage: wget [OPTION]... [URL]...

Try `wget --help' for more options.
tweedleburg:~ $ wget 2>/dev/null
tweedleburg:~ $

你看 - 在第二個例子中,錯誤消息被抑制了:)

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