我知道如何在启动时在单个屏幕会话中创建多个窗口:
但是一旦我启动并运行,有没有办法可以将我的输入发送到所有打开的窗口,而不仅仅是当前关注的窗口?
答案 0 :(得分:31)
我在这里找到了一个很好的教程:
来自帖子:
一旦您习惯了多个窗口,您可能会遇到要向其中几个打开的窗口发送相同命令的情况。屏幕提供“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)
您可能还希望仅发送到选定的窗口(多播)。
根据需要设置标题。
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)。
您可以通过这种方式启用/禁用基于窗口标题的多播。