如何为列表中的每个目录打开一个 GNU 屏幕选项卡

如何为列表中的每个目录打开一个 GNU 屏幕选项卡

我有以下脚本-它有点作品。

#!/bin/bash  

... define plugins, etc

for plugin in ${plugins[@]};
do 
  screen -t $plugin
done

我想要它做什么

打开 gnu-screen 并为每个插件(目录名)启动一个新选项卡,以插件名称作为选项卡的标题。

它现在做什么

打开 gnu-screen 并在 screen 实例中打开第一个插件(具有正确的标题),但不会继续运行命令。所以当我退出第一个 screen 时,第二个插件会在 screen 实例中打开,当我退出时,第三个插件会打开,等等。

我缺少什么

我只想说screen -t $plugin &&,例如,运行这个东西,然后运行下一个。但我不确定如何在 for 循环中做到这一点

答案1

#!/bin/bash

plugins=(Plugin1 Plugin2 Plugin3)

plugin_cmd="#!/bin/bash\necho This is plugin __placeholder__\n"
for plugin in ${plugins[@]};
do
    echo -e ${plugin_cmd/__placeholder__/$plugin} > /tmp/${plugin}.bash
    chmod +x /tmp/${plugin}.bash
    screen -dmS $plugin
    screen -S $plugin -X stuff "/tmp/${plugin}.bash\n"
    screen -d -r -S $plugin
done

听取 Thom Wigger 的建议并切换到 tmux。

答案2

为什么不生成自定义的.screenrc?

例如,如果您的插件文件夹不经常更改,则将其写入文件。

# Setting custom things:
startup_message off   

# starting a few shells with a preselected title
screen -t plugin1 0
screen -t plugin2 1
screen -t plugin3 2
screen -t my_email  -a -l exec elm  


如果插件的数量经常变化,那么您可以使用 bash 脚本将它们写入文件。例如

rm ~/my_custom_screenrc
echo "# Setting custom things:" > ~/my_custom_screenrc
echo "startup_message off"      >> ~/my_custom_screenrc

接下来是你的 bash 脚本,你在其中更改

for plugin in ${plugins[@]};
do 
  screen -t $plugin
done

使用 echo 将追加 ( >>) 到与上面相同的文件。

最后启动屏幕。例如screen -c ~/my_custom_screenrc


这远非一个完美的答案,我希望如此恰当的一周内就会有答案。但我看不出有什么办法可以将其作为评论发布,同时还能保留足够的标记以使其易于理解。

答案3

你应该试试:

screen -t $plugin xterm &

而不是你的版本。屏幕打开一个新的壳,你将被困在里面,没有任何可能继续循环;因此 & 符号确保控制权立即返回到循环,while终端(或者 konsole,或者任何你喜欢的名字)提供了一个地方,可以说,屏幕在这里执行其工作。

相关内容