如何在不制作任何新管道或文件的情况下将输出从一个终端发送到另一个终端

Edw*_*lds 33 command-line

我只是在我的终端(Gnome 终端)上闲逛。我想知道有没有一种方法可以将一个终端的输出发送到另一个终端而无需创建新文件或管道。

例如:在第一个终端上我运行ls并希望其输出显示在第二个终端上(在第二个终端上使用或不使用任何命令)

Rea*_*tic 39

如果两个终端属于同一用户,您可以将输出发送到用作特定终端的 tty 的虚拟设备。

因此,您可以使用 的输出w(其中包括 TTY 信息)并直接写入该设备。

ls > /dev/pts/7
Run Code Online (Sandbox Code Playgroud)

(如果提到的设备w是pts/7)

另一种选择是使用连接到该设备的进程号。将您的输出发送到/proc/<process number>/fd/1.

ls > /proc/5555/fd/1
Run Code Online (Sandbox Code Playgroud)

假设您发现在该终端中运行的进程号是 5555。

请注意,仅当尝试写入的用户与拥有另一个终端的用户相同时,才允许此直接写入。

  • @edwardtorvalds 我是说它们被连接为`/proc/XXX/fd/1` 应该是一个软链接到`w` 命令显示的任何设备。`ls -l` 的输出是什么? (4认同)
  • @edwardtorvalds `/proc/XXX/fd/1` 通常是到基本设备的软链接。尝试使用 `ls -l /proc/XXXX/fd/1` 并查看它指向的内容。它与 `w` 命令中出现的内容有任何关系吗? (2认同)

tac*_*omi 19

您可以使用write命令。

正如@MelBurslan 评论的,如果写权限关闭,首先执行:

 $ mesg y
Run Code Online (Sandbox Code Playgroud)

man mesg

选项

y 允许对您的终端进行写访问。

写的用法:

$ write username tty
Run Code Online (Sandbox Code Playgroud)

例如将ls输出发送到其他终端。

$ w
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     :0       :0               08:15   ?xdm?   7:37   0.25s init --user
user     pts/0    :0               08:19    1.00s  0.09s  0.01s w
user     pts/12   :0               08:50   54.00s  0.03s  0.03s bash

$ ls | write username pts/12
Run Code Online (Sandbox Code Playgroud)


Edw*_*lds 10

我找到了一个类似的方法。

在第一个终端上

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>
Run Code Online (Sandbox Code Playgroud)

在第二个终端

$ ls > /dev/pts/0
Run Code Online (Sandbox Code Playgroud)

现在你在第一个终端上得到输出

  • @tachomi 实际上不需要任何命令来读取输出 (3认同)

Vit*_*ert 8

tty在每个终端中使用命令来识别它们:

$ tty
/dev/pts/0

$ tty
/dev/pts/1
Run Code Online (Sandbox Code Playgroud)

假设这些 TTY,要将第一个的 stdout 重定向到第二个,请在第一个终端中运行:

exec 1>/dev/pts/1
Run Code Online (Sandbox Code Playgroud)

注意:现在每个命令输出都将显示在 pts/1 上

要恢复 pts/0 的默认行为标准输出:

exec 1>/dev/pts/0
Run Code Online (Sandbox Code Playgroud)

请参阅此视频以进行演示。