Bash

當標準輸出通過管道傳輸時,程序如何輸出到終端?

  • September 7, 2020

我被要求澄清這個問題。我沒有詢問任何特定程序的行為,但我使用 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實例並以這種方式處理管道。

然後我想知道終端輸出與管道輸出的關係,以及幕後究竟發生了什麼。

編輯:當我寫那個時,我忘記了我通常擷取和輸出兩者stdoutstderr使用Process該類。在 Windows 下,根據stderr我的經驗很少使用,在 Unix 中stderr用於非錯誤終端輸出可能是例行公事嗎?只是猜測…

程序有兩種不同的方法來發送與其標準輸出分開的輸出。

一種是輸出到標準錯誤,正如您所懷疑的,這在 Unix 風格的環境中可能比在 Windows 上更常見;請參閱進度報告/日誌資訊是否屬於標準錯誤或標準輸出?對此進行一些討論。標準錯誤可以重定向;請參閱shell 的控制和重定向運算符是什麼?

另一種是直接輸出到程序正在執行的終端,如果有的話,使用/dev/tty. 請參閱“less”如何從標準輸入獲取數據,同時仍然能夠讀取使用者的命令?對此進行討論(關於輸入,但類似的方面適用於輸出)。

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