在屏幕中,如何在单个屏幕会话中向所有虚拟terminal窗口发送命令?

我知道如何在启动时在一个屏幕会话中创build多个窗口:

但是一旦我将它们启动并运行,有没有办法让我的input被发送到所有打开的窗口,而不仅仅是当前的焦点?

我在这里找到一个很好的教程来做到这一点:

http://blog.cone.be/2009/11/24/gnu-screen-nethack-different-screen-windows-sending-commands-to-all-screen-windows/

从帖子:

一旦你习惯了多个窗口,你可能会遇到一种情况,你想发送一个相同的命令到几个打开的窗口。 屏幕提供在“at”命令来做到这一点。 首先你需要打开命令行模式。

Ca:(冒号)进入命令行模式。

这样你可以输入一次命令,但是你仍然需要输入每个单独的窗口。 但是有一个更好的方法。 作为例子,我们将发送“ls -l”到所有的窗口。

在“#”填充“ls -l ^ M”

这个命令几乎不可读,所以让我们把它分开! 第一部分是'在[标识符] [#| * |%]命令'。 at命令将文本参数发送到您在标识符中指定的所有窗口。 您可以使用#将符合条件的窗口名称或编号与带有*号或用户名的用户名匹配。 下一部分是您要在选定的窗口中运行的命令。 我们使用“stuff”将要执行的命令填充到所选窗口的输入缓冲区中。 东西真的很简单。 它只是填充你给出的字符串作为参数。 下一个问题是命令。 或者是让它执行! 要让屏幕在命令后面输入“enter”,执行该命令,在末尾添加“^ M”。 你可以做更多的事情,而不仅仅是发送一个ls到输入。 任何屏幕命令,如重命名,移动窗口周围,whatnot ..结合“at”可用。

对不起,这迟来的答复,但tmux可能是一个比screen更好的选择。 在tmux ,你必须按下: Cb :进入命令模式并输入: setw synchronize-panes (或者使用自动完成setw sync<Tab> )。 请注意,此命令启用窗格之间的同步(一个分割屏幕的区域,同时可见),但不能在窗口(完整,不分割,屏幕)之间进行同步。

您也可能只想发送到选定的窗口(多播)。

  1. 约定 :给窗口标题的第一个字符广播标志的含义。 例如,如果标题以“。”开始 那么窗口监听广播,否则不会。
  2. 根据需要设置标题。

     screen -S SessionName -p 0 -X title "remote_0" # window 0: ignore multicast screen -S SessionName -p 1 -X title ".remote_1" # window 1: listen to multicast 
  3. 使用屏幕的at命令将内容发送到监听器

     screen -S SessionName -X at ".#" stuff "date " 
  4. 注意:上面的结尾双引号确保^ M被发送(Cr)。

  5. 这样可以基于窗口标题启用/禁用多播。