如何从单个 bash 脚本启动多个屏幕会话?

如何从单个 bash 脚本启动多个屏幕会话?

我编写了一个脚本(但没有起作用),如下所示:

#!/bin/sh

screen -dmS "somename" somecommand

for i in {0..5}; do
    screen -dmS "name$i" anothercommand $i
done

出于某种原因,如果我将其复制并粘贴到终端中,它会像我预期的那样创建 7 个分离的屏幕会话。但是,如果我从脚本中运行它,则运行时只会获得第一个会话“somename” screen -ls

编辑:如果可以通过其他方式实现相同的功能(例如使用多个屏幕窗口而不是会话),我也会提供这些解决方案。谢谢!

答案1

我最终把这个问题提交到了 StackOverflow,布莱恩·杰拉德回答了这个问题。{0..5}循环语法是 bash (3.x+) 特有的。默认情况下,我的系统设置为从 运行其他 shell /bin/sh,因此我将 sharp-bang 更改为#!/bin/bash,我的问题就解决了!

答案2

为什么需要打开这么多屏幕会话?相反,为什么不尝试在单个屏幕会话中创建多个窗口(我的意思是作为单屏终端窗口的一部分)。您可以使用 ctrl-a 1 或 2 或 3 等在它们之间切换,具体取决于您创建了多少个窗口以及想要查看输出。

这听起来像是运行屏幕的一个糟糕方法。如果您还没有听说过屏幕中的多个窗口,请阅读网络上有关屏幕的任何教程。屏幕的主要设计目标是窗口复用 - 而不仅仅是连接和分离。

答案3

不幸的是,我无法回答你的评论因为我的声誉太小,所以我不得不将其放入单独的答案中。

您可以使用配置文件创建具有多个窗口的单个屏幕会话screenrc屏幕手册页告诉您一切,但以下是可以解决您的问题的最重要的事情:

以下 screenrc 创建具有 2 个窗口的屏幕会话。一个窗口将运行bash,另一个窗口将运行python(交互):

sessionname myscreensession
screen -t command1 0 bash
screen -t command2 1 python

名字我的屏幕会话执行时显示screen -ls,可用作 的参数screen -r。字符串命令N指定 screen 会话中的窗口名称。数字(0 和 1)指定在哪个窗口中运行命令(您不必使用后续数字)。

您还可以稍后向正在运行的屏幕会话中添加带有新命令的另一个窗口,例如:

screen -X screen -S myscreensession -t command3 2 python3

python3这将创建一个在现有会话中运行的新窗口。

答案4

我真的不知道为什么你的脚本不起作用,但启动多个屏幕会话的另一种方法是创建自定义屏幕配置文件。它在这个 AskUbuntu 问题中进行了讨论:https://askubuntu.com/questions/49245/start-multiple-apps-running-in-shells-split-in-one-console

我想你可以简单地创建具有以下内容的配置文件 test.conf 并启动screen -d -c test.conf

screen -S "somename" somecommand
screen -S "name1" anothercommand 1
screen -S "name2" anothercommand 2
...

如果有效,那么您的脚本可以首先创建这个 test.conf 文件,并在循环中使用以下代码对其进行自定义:

echo "screen -S "name$i" anothercommand $i" >> test.conf

然后screen -d -c test.conf从脚本末尾开始。

相关内容