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


26

我只是在我的终端(Gnome终端)上鬼混。我想知道是否有一种方法可以将一个终端的输出发送到另一终端,而不必创建新文件或管道。

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


你有什么?你有尝试过吗?你能举一些例子吗?
tachomi

@tachomi在我运行的第一个终端上ls,希望其输出显示在第二个终端上(无论是否在第二个上使用任何命令)
Edward Torvalds

Answers:


30

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

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

ls > /dev/pts/7

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

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

ls > /proc/5555/fd/1

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

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


我没有获得命令/dev/pts/7或类似w命令,但是第二种方式对我有效
Edward Torvalds

2
@edwardtorvalds /proc/XXX/fd/1通常是到基本设备的软链接。尝试使用ls -l /proc/XXXX/fd/1并查看其指向的内容。它与w命令中显示的内容有任何关系吗?
RealSkeptic

我不涉及w与命令/proc/XXX/fd/0我有关w命令/dev/pts/7
爱德华·托沃兹

4
@edwardtorvalds我说的是它们已连接,/proc/XXX/fd/1应该是该w命令显示的任何设备的软链接。它的输出是ls -l什么?
RealSkeptic

TTY信息也可以在tty(仅当前)或who(全部)的输出中找到。
Nick Volynkin

14

您可以使用write命令。

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

 $ mesg y

man mesg

选项

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

写入的用法:

$ write username tty

例如,将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

在arch linux上,在gnome终端中,w命令的输出是edward tty2 19:53 6:05 2:48 23.12s firefox,如果我写的话,ls | write edward tty2我没有任何输出,但是发出哔声
爱德华·托瓦尔兹

@edwardtorvalds您释放了键入 edwardd而不是edward
tachomi

另外,如果我在tty5(ctrl + alt + 5)上尝试,也会收到错误消息you have turned write permission off
Edward Torvalds

在该网站上键入错误
Edward Torvalds

mesg y在运行命令之前,先在目标终端上尝试命令
MelBurslan

7

我发现了类似的方法。

在第一个航站楼

 $ tty
 /dev/pts/0
 $ <no need to run any command here, just see the output>

在第二个航站楼

$ ls > /dev/pts/0

现在,您在第一个终端上获得了输出


1
tail -f而不是cat可能有用
tachomi

3
@tachomi实际上实际上不需要任何命令即可读取输出
Edward Torvalds

4

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

$ tty
/dev/pts/0

$ tty
/dev/pts/1

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

exec 1>/dev/pts/1

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

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

exec 1>/dev/pts/0

观看此视频进行演示。


这个答案也很好
爱德华·托瓦尔兹

0

您可以写入终端的TTY;例如:

在1号航站楼:

$ tty 
ttys000

在2号航站楼:

$ tty
ttys029

$ exec &> >(tee >(cat >&/dev/ttys000))
ls 

即使您键入内容,输出也会实时显示在两个终端中。

适用于linux和macOS。/dev/{number}在Linux上,macOS TTY路径是/dev/pts/{number}


执行exec &> >(tee >(cat >&/dev/ttys000))不存在,因此无法键入。
爱德华·托瓦尔兹

在Linux上的@EdwardTorvalds tty将类似于/dev/pts/0
Miguel Mota

是的,这就是我用来测试您的代码的方式
Edward Torvalds

@EdwardTorvalds什么命令不存在?
Miguel Mota

您的命令exec &> >(tee >(cat >&/dev/pts/1))。没有控制键组合(ctrl + c)。我必须杀死航站楼才能退出
爱德华·托瓦尔兹

-3

您还可以使用wall

$ wall "Message here"

您可能需要详细描述。我对此
爱德华·托瓦尔兹

3
您绝对希望使用wall(“全部写入”的缩写),因为它会写入每个已登录的tty会话,包括您从中发送的会话。相反,using write允许声明特定的tty。
蒙蒂·哈德,2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.