当标准输出通过管道传输时,程序如何输出到终端?

McG*_*V10 0 bash terminal pipe stdout

我被要求澄清这个问题。我不是在询问任何特定程序的行为,但我使用 ffmpeg 作为我询问的行为的示例。重申这个问题:

当一个程序通过stdout管道传输到另一个程序时,该程序如何也产生终端输出。是stderr输出流方面的唯一选择吗?

原问题:

我是一名长期的 Windows 开发人员,正在慢慢学习 Linux 以支持各种电子产品和编程爱好。我正在使用一些无头 Raspberry Pi,所以我只通过 ssh 终端与它们交互。我原以为终端输出只是stdout,实际上,当我通过Process类控制从 .NET Core 程序启动的子进程时,终端输出就是我的程序在拦截stdout流时接收到的内容。

但是我需要启动 bash 以便我可以将 ffmpeg 通过管道传输到 VLC,当我从终端“手动”执行此操作时,我意识到 ffmpeg 将处理细节写入终端,同时将数据传输到 VLC。我原以为命令行管道会重定向stdout到另一个程序的stdin.

我在使用 bash 时遇到了问题(它似乎没有将stdin数据从我的程序传递到使用bash -c "ffmpeg ... | cvlc ..."switch启动的程序),所以我正在考虑使用两个Process实例并以这种方式处理管道。

然后我想知道终端输出与管道输出的关系,以及幕后真正发生的事情。

编辑:当我写的,我忘了,我通常采集和输出都stdoutstderr使用Process类。在Windows下,stderr我的经验中很少使用,是否在Unix中stderr用于非错误终端输出可能是例行公事?只是猜测...

Ste*_*itt 5

程序发送与其标准输出分开的输出有两种不同的方法。

一种是输出到标准错误,正如您所怀疑的,这在 Unix 风格的环境中可能比在 Windows 上更常见;请参阅进度报告/日志信息是否属于 stderr 或 stdout?对此进行一些讨论。标准错误可以重定向;请参阅shell 的控制和重定向运算符是什么?

另一种是直接输出到程序正在运行的终端,如果有的话,使用/dev/tty. 请参阅“less”如何从标准输入获取数据,同时仍然能够从用户读取命令?对此的讨论(关于输入,但类似的方面适用于输出)。