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

Linux 在Screen中,如何在单个屏幕会话中向所有虚拟终端窗口发送命令?,linux,gnu-screen,Linux,Gnu Screen,我知道如何在启动时在一个屏幕会话中创建多个窗口: 但是,一旦我启动并运行它们,是否有一种方法可以将我的输入发送到所有打开的窗口,而不仅仅是当前关注的窗口?我在这里找到了一个很好的教程: 从职位: 一旦您习惯了多个窗口,您可能会遇到这样的情况:您希望向其中几个打开的窗口发送相同的命令。屏幕中提供了“at”命令来执行此操作。首先,您需要打开命令行模式 C-a:(冒号)进入命令行模式 这样,您可以键入一次命令,但仍必须输入每个单独的窗口。但是有更好的办法。例如,我们将向所有窗口发送“ls-l” 在“

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


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

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

从职位:

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

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

这样,您可以键入一次命令,但仍必须输入每个单独的窗口。但是有更好的办法。例如,我们将向所有窗口发送“ls-l”

在“#”stuff“ls-l^M”

这个命令几乎不可读,所以让我们把它拆开!第一部分是“at[identifier][#|*|%]命令”。at命令将文本参数发送到标识符中指定的所有窗口。您可以使用%将条件与窗口名或数字与#、用户名与*或显示相匹配。下一部分是要在选定窗口中运行的命令。我们使用“stuff”将要执行的命令填充到所选窗口的输入缓冲区中。事情真的很简单。它只是填充作为参数提供的字符串。下一个问题是命令。或者更确切地说是执行它!若要使屏幕在命令后显示“回车”,若要执行命令,请在末尾添加“^M”。除了向输入端发送ls外,您还可以做更多的事情。任何屏幕命令,比如重命名、移动窗口等等。。可与“at”组合使用


很抱歉,这个迟来的答复,但是对于您来说,
tmux
可能比
screen
更好。在
tmux
中,您必须按:
C-b:
进入命令模式并输入:
setw synchronize窗格
(或者只需使用自动完成功能
setw sync
)。请注意,此命令启用窗格之间的同步(一个拆分屏幕的区域,同时可见),但不启用窗口之间的同步(完整屏幕,而不是拆分屏幕)

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

  • 约定:为窗口标题的第一个字符指定广播标志的含义。例如,如果标题以“.”开头,则窗口会收听广播,否则不会
  • 根据需要设置标题。

    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
    
  • 使用屏幕上的at命令将内容发送给听众

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

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


  • +1代表“东西”。非常感谢,科里!这是一百万次被遗忘的屏幕会话慢慢消亡的声音:
    screen-X在“感谢飞行的Vim”^UTMOUT=3600^M“
    +1链接中断):回程链接:这是一种比其他答案更好的方式和视觉体验。对不起,问题是关于屏幕,我同意tmux是一个更好的程序,但这在这里并不重要。