Bash 脚本启动新终端

问题描述 投票:0回答:1

我正在尝试编写一个脚本来启动多个新终端。我有启动新终端的命令,工作正常。就像我说的,它应该启动多个新终端,为此我设置了一个 for 循环。我的问题是,当它启动第一个新终端时,该新终端将成为“活动”终端,并且它不会返回到原始脚本来完成循环并启动其他终端。有没有办法释放新终端并完成循环以启动其他终端?感谢您的帮助。

我尝试使用 & 命令将进程发送到后台,但由于某种原因,启动了要启动的第一个终端的重复项,然后像以前一样停止。我是脚本编写新手,我已经做了很多查找,但我发现似乎没有任何内容适用于我正在尝试做的事情。

for line in ${array_of_terminals_to_launch[@]}
do
     grep -F -i $array_of_terminals_to_launch /path/to/file/of/gnome-terminal_commands | sh

这模拟了执行的文件中的命令

gnome-terminal -q --geometry="105x8" --window --title"Title 1" --command="command_to_run_in_new_terminal" --tab --title"Tab 2" --command="command_to_run_in_second_tab"
bash terminal background gnome-terminal
1个回答
0
投票

我的问题是,当它启动第一个新终端时,该新终端将成为“活动”终端,并且它不会返回到原始脚本来完成循环并启动其他终端。有没有办法释放新终端并完成循环以启动其他终端?

当然,只需在命令后添加

&
即可将循环中的进程设置为后台:

gnome-terminal -q \
    --geometry="105x8" \
    --window \
    --title "Title 1" \
    --command="command_to_run_in_new_terminal" \
    --tab \
    --title "Tab 2" \
    --command="command_to_run_in_second_tab" &

(请注意,在 Ubuntu 23.04 中的 Unity 上,这不是必需的,因为

gnome-terminal
命令通过
gnome-terminal-server
守护进程进程启动新的终端窗口并退出。)

窗口管理器...它们如何工作?

成为“活动终端”实际上只是您的窗口管理器创建的幻象。终端窗口会在您选择的窗口上方弹出。您的窗口管理器中可能有一个设置不聚焦新窗口。

因此,修复此用户体验涉及 a) 配置窗口管理器以不让新窗口窃取焦点,或 b) 启动

gnome-terminal
最小化。

我发现的“Start

gnome-terminal
最小化”问题的任何解决方案似乎都取决于给定的窗口管理器对此的支持。 X11 的 解足够复杂,涉及
xdotool
。没有 Wayland 解决方案出现。

修复
for
循环

好吧,让我们回到最初的问题,即您的脚本没有启动多个进程。

听起来就像

gnome-terminal
在命令完成后保持打开状态。这不好。如果您使用语法
gnome-terminal -- sh -c 'MYCOMMAND'
,它将在命令完成后关闭终端。

例如:

COMMANDS=(
    'ls; sleep 5'
    'ls; sleep 5'
    'ls; sleep 5'
    'ls; sleep 5'
    'echo "hello world"; sleep 5'
    'ls; sleep 5'
    'echo "hello world"; sleep 5'
)

for cmd in "${COMMANDS[@]}"; do
    gnome-terminal -q --geometry="105x8" -- sh -c "$cmd" &
done

但这不好,它会立即启动所有内容!如果有数百个作业怎么办,这会耗尽您的 CPU,更有可能耗尽 RAM。

不让计算机超载:使用 GNU Parallel 重写
for
循环

对于主循环,您也可以利用 GNU Parallel 生成多个终端。使用

-j3
,它一次只会启动 3 个终端,并等待一个终端退出,然后再启动另一个终端。

COMMANDS=(
    'ls; sleep 5'
    'ls; sleep 5'
    'ls; sleep 5'
    'ls; sleep 5'
    'echo "hello world"; sleep 5'
    'ls; sleep 5'
    'echo "hello world"; sleep 5'
)

parallel -j3 gnome-terminal -q --geometry="105x8" --wait -- sh -c ::: "${COMMANDS[@]}"
# -j3 = launch 3 jobs at once

添加

--wait
会导致终端进程不会分叉到后台。如果它分叉,它只会同时启动所有内容,从而否定我们的作业控制尝试。

© www.soinside.com 2019 - 2024. All rights reserved.