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

时间:2011-06-28 17:32:39

标签: linux gnu-screen

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

但是一旦我启动并运行,有没有办法可以将我的输入发送到所有打开的窗口,而不仅仅是当前关注的窗口?

3 个答案:

答案 0 :(得分:31)

我在这里找到了一个很好的教程:

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

来自帖子:

  

一旦您习惯了多个窗口,您可能会遇到要向其中几个打开的窗口发送相同命令的情况。屏幕提供“at”命令来执行此操作。首先,您需要打开命令行模式。

     

C-a :(冒号)进入命令行模式。

     

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

     

在“#”的东西“ls -l ^ M”

     

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

答案 1 :(得分:8)

很抱歉这个迟来的回复,但tmux可能比screen更适合您。在tmux中,您必须按:C-b :进入命令模式并输入:setw synchronize-panes(或仅setw sync<Tab>使用自动完成功能)。请注意,此命令启用窗格(一个分屏的区域,同时可见)之间的同步,但不启用窗口之间的同步(完整,不分割,屏幕)。

答案 2 :(得分:5)

您可能还希望仅发送到选定的窗口(多播)。

  1. 约定:为窗口标题的第一个字符赋予广播标志的含义。例如。如果标题以&#34;开头。&#34;然后窗口收听广播,否则它不会。
  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. 您可以通过这种方式启用/禁用基于窗口标题的多播。