我被要求澄清这个问题。我没有询问任何特定程序的行为,但我使用 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
实例并以这种方式处理管道。
然后我突然想知道终端输出与管道输出的关系,以及幕后到底发生了什么。
编辑:当我写这篇文章时,我忘记了我通常捕获和输出两者stdout
并stderr
使用该类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 会如何处理其他命令的文本输出超出了我的范围......
如果你解释了你的目标,我可能会更幸运地帮助你......