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

Aar*_* Fi 19 linux gnu-screen

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

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

Cor*_*son 32

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

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

  • 为"东西"+1.非常感谢,Corey! (2认同)

小智 8

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

  • 对不起,但问题是关于屏幕,我同意tmux是一个更好的方案,但这在这里几乎不相关. (4认同)

小智 5

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

  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用屏幕的at命令将内容发送给侦听器

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

  5. 您可以通过这种方式基于窗口标题启用/禁用多播.