如何向screen会话中的部分窗口发送相同命令
按指定窗口号向screen部分窗口发送输入的方法
刚好之前折腾过screen的批量操作,针对你要按窗口号筛选发送命令的需求,咱们可以用循环结合screen的内置命令来实现,具体步骤如下:
1. 先确认目标screen会话名称
首先用下面的命令列出当前所有screen会话,找到你要操作的那个会话名称(比如my_project):
screen -list
2. 向指定窗口号发送命令
如果你已经明确知道要给哪些窗口发命令(比如窗口1、3、5),直接用循环遍历这些窗口号,对每个窗口单独执行stuff命令写入输入缓冲区:
# 替换成你的会话名、目标窗口号和要发送的命令 TARGET_SESSION="my_project" TARGET_WINDOWS="1 3 5" COMMAND_TO_SEND="ls -l\n" for win in $TARGET_WINDOWS; do screen -S $TARGET_SESSION -p $win -X stuff "$COMMAND_TO_SEND" done
这里的参数解释:
-S $TARGET_SESSION:指定要操作的screen会话-p $win:锁定目标窗口号(循环变量依次取你指定的窗口号)-X stuff "$COMMAND_TO_SEND":向该窗口的输入缓冲区写入内容,\n模拟回车键执行命令
3. 排除特定窗口发送命令
如果需要给除了某个窗口之外的所有窗口发命令,比如排除窗口2,可以先提取会话内的所有窗口号,再过滤掉要排除的窗口:
TARGET_SESSION="my_project" EXCLUDE_WINDOW="2" COMMAND_TO_SEND="echo 'Hello to all except window 2'\n" # 提取所有窗口号 ALL_WINDOWS=$(screen -S $TARGET_SESSION -Q windows | awk '{for(i=1;i<=NF;i++) if($i~/^[0-9]+$/) print substr($i,1,length($i)-1)}') # 遍历排除后的窗口号发送命令 for win in $ALL_WINDOWS; do if [ "$win" != "$EXCLUDE_WINDOW" ]; then screen -S $TARGET_SESSION -p $win -X stuff "$COMMAND_TO_SEND" fi done
其中screen -S $TARGET_SESSION -Q windows会输出会话内所有窗口的信息,再用awk提取出纯窗口号(去掉后面的$符号)。
小提示
- 如果你不确定窗口号,可以在screen会话内按下
Ctrl+a + "(双引号),弹出窗口列表查看每个窗口对应的数字编号 - 注意不同screen版本的窗口号可能从0或1开始,建议用
screen -Q windows命令确认实际编号
内容的提问来源于stack exchange,提问作者Chancelot
相关产品推荐
相关产品推荐

