當標準輸出通過管道傳輸時,程序如何輸出到終端?
我被要求澄清這個問題。我沒有詢問任何特定程序的行為,但我使用 ffmpeg 作為我詢問的行為的範例。重申問題:
當一個程序通過
stdout
管道傳輸到另一個程序時,該程序如何產生終端輸出。在輸出流方面是stderr
唯一的選擇嗎?原始問題:
我是一名長期的 Windows 開發人員,我正在慢慢學習 Linux 以支持各種電子和程式愛好。我正在使用一些無頭樹莓派,所以我只通過 ssh 終端與它們互動。我曾以為終端輸出只是
stdout
.NET Core 程序通過類啟動子程序時Process
,終端輸出是我的程序在攔截stdout
流時收到的內容。但是我需要啟動 bash 以便將 ffmpeg 管道傳輸到 VLC,並且我意識到當我從終端“手動”執行此操作時,ffmpeg 將處理細節寫入終端,同時將數據傳輸到 VLC。我曾認為命令行管道重定向
stdout
到另一個程序的stdin
.我在使用 bash 時遇到了問題(它似乎沒有將
stdin
數據從我的程序傳遞到使用bash -c "ffmpeg ... | cvlc ..."
開關啟動的程序),所以我正在考慮使用兩個Process
實例並以這種方式處理管道。然後我想知道終端輸出與管道輸出的關係,以及幕後究竟發生了什麼。
編輯:當我寫那個時,我忘記了我通常擷取和輸出兩者
stdout
並stderr
使用Process
該類。在 Windows 下,根據stderr
我的經驗很少使用,在 Unix 中stderr
用於非錯誤終端輸出可能是例行公事嗎?只是猜測…
程序有兩種不同的方法來發送與其標準輸出分開的輸出。
一種是輸出到標準錯誤,正如您所懷疑的,這在 Unix 風格的環境中可能比在 Windows 上更常見;請參閱進度報告/日誌資訊是否屬於標準錯誤或標準輸出?對此進行一些討論。標準錯誤可以重定向;請參閱shell 的控制和重定向運算符是什麼?
另一種是直接輸出到程序正在執行的終端,如果有的話,使用
/dev/tty
. 請參閱“less”如何從標準輸入獲取數據,同時仍然能夠讀取使用者的命令?對此進行討論(關於輸入,但類似的方面適用於輸出)。