根据此答案由席利,less从标准错误读取导航命令,如果它不能够打开/dev/tty。
这似乎令人费解,因为我从未见过任何写入另一个程序的 stderr 流的内容,而且我什至不知道如何实现。
为读取和写入而打开 stderr 的目的是什么?如果这很有用,我如何在现代系统上使用它?(例如,是否有一些神秘的语法可以将某些东西传送到 stderr 而不是 stdin?)
在 Lubuntu 18.04 上,我在 lxterminal 中运行了一个 shell。它的控制终端是当前的伪终端从机:
$ tty
/dev/pts/2
Run Code Online (Sandbox Code Playgroud)
我想知道我当前的控制终端/dev/pts/2和/dev/tty.
/dev/tty就像我当前的控制终端/dev/pts/2:
$ echo hello > /dev/tty
hello
$ cat < /dev/tty
world
world
^C
Run Code Online (Sandbox Code Playgroud)但它们似乎是不相关的文件,而不是一个符号链接或硬链接到另一个:
$ ls -lai /dev/tty /dev/pts/2
5 crw--w---- 1 t tty 136, 2 May 31 16:38 /dev/pts/2
13 crw-rw-rw- 1 root tty 5, 0 May 31 16:36 /dev/tty
Run Code Online (Sandbox Code Playgroud)对于不同控制终端的不同会话,if
/dev/tty保证是它们的控制终端。它如何成为不同的控制终端,而不是符号链接或硬链接?
那么它们之间的关系和区别是什么?任何帮助深表感谢!
这篇文章来自于较早的一个命令`tty`和文件`/dev/tty`的输出都是指当前bash进程的控制终端吗?
我被要求澄清这个问题。我不是在询问任何特定程序的行为,但我使用 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实例并以这种方式处理管道。
然后我想知道终端输出与管道输出的关系,以及幕后真正发生的事情。
编辑:当我写的,我忘了,我通常采集和输出都stdout和stderr使用Process类。在Windows下,stderr我的经验中很少使用,是否在Unix中stderr用于非错误终端输出可能是例行公事?只是猜测...