Io-Redirection
為什麼不寫到標準輸入?
根據這個答案,
stdin
、stdout
和stderr
最初都連接到同一個地方(與 相同/dev/tty
),並且讀取stdin
和寫入的約定stdout
和stderr
只是:約定。在那種情況下,為什麼有單獨的
stdin
和stdout
流,而不是將它們組合成一個?
標準輸入、標準輸出和標準錯誤等 FILE 指針只能包含一個底層文件描述符。因此,如果您有如下管道設置:
ls | grep foo | less
那麼grep的stdin、stdout和stderr都有不同的fileno(),因為有兩個連接的pipe()。因此也必須有不同的文件。
將輸入流與輸出流分開使程序在讀取輸入的同時更容易寫入輸出。
允許程序使用重定向或管道將其輸出寫入其他地方比輸入來自何處更容易。
此外,除了約定之外,三個標準 I/O 流也是標準的。參見例如POSIX 標準的系統介面部分中關於標準 I/O 流的部分。
該部分的基本原理說:
儘管 ISO C 標准保證,在程序啟動時,stdin 可以讀取,stdout 和 stderr 可以寫入,但這種保證是有條件的(正如 ISO C 和 POSIX 標準所做的所有保證一樣)在符合要求的環境中執行。使用文件描述符 0 未打開以供讀取或使用文件描述符 1 或 2 未打開以供寫入執行的程序在不符合標準的環境中執行。警告應用程序編寫者
$$ … $$不執行標準實用程序或符合標準的應用程序,其中文件描述符 0 未打開以供讀取或文件描述符 1 或 2 未打開以供寫入。