【问题标题】:how to attach to screen sessions within a loop?如何在循环中附加到屏幕会话?
【发布时间】:2026-02-01 05:40:01
【问题描述】:

我使用 bash 脚本以“分离”模式生成屏幕会话(使用 -d -m 选项) 并命名它们(通过 -S ),然后我附加到它们以给出一些命令 (通过 -r ):

#!/bin/bash
screen -d -m -S session_name_1
screen -d -m -S session_name_2
screen -d -m -S session_name_3
...
screen -r session_name_1
screen -r session_name_2
screen -r session_name_3

当我以循环方式执行整个过程时,我无法附加到屏幕上 (文件 session_names.txt 是一个每行包含一个会话名称的文件):

#!/bin/bash
while read line; do
  echo $line
  screen -d -m -S $line
done < session_names.txt

while read line; do
  echo $line
  screen -r $line
done < session_names.txt

我无法附加到屏幕并出现此错误:

“必须连接到终端。”

我该如何克服这个问题以及为什么会出现这个问题?

【问题讨论】:

  • 您是否有理由不使用 .screenrc 来启动 1 个屏幕副本,其中 N 个终端可用,只需将名称等放入该 cfg 文件中?祝你好运。

标签: linux bash session loops gnu-screen


【解决方案1】:

在整个循环中,标准输入来自txt文件,所以屏幕看不到终端。

应该这样做,但请注意这里的“line”实际上是“word”的意思。

for line in `cat session_names.txt`; do
  echo $line
  screen -r $line
done

【讨论】:

  • for var in $(cat file) 效率低下,因为它会生成并保留整个列表,并且像您提到的那样容易分词。 mywiki.wooledge.org/BashFAQ/001 中描述了更好的方法(请参阅标题为“如何防止其他命令“吃掉”输入的最后一节)。