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

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

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

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

原问题:

我是一名长期的 Windows 开发人员,正在慢慢学习 Linux 以支持各种电子和编程爱好。我正在使用一些无头 Raspberry Pi,因此我仅通过 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非错误终端输出的例行程序吗?只是一个猜测...

答案1

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

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

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

答案2

stderr 和 stdout 是将文本输出到终端的默认方式。

使用 echo 和重定向输出到 stderr 和 stdout 的函数:

function multioutput(){
 >&2 echo 'stderr output'
 echo 'stdout output'
}

要将 ffmpeg stderr 重定向到 stdout,因此两者都通过管道传输到 vlc stdin:

2>&1 ffmpeg -arg1 -arg2|vlc

vlc 会如何处理其他命令的文本输出超出了我的范围......

如果你解释了你的目标,我可能会更幸运地帮助你......

相关内容