我正在尝试编写一个脚本来启动多个新终端。我有启动新终端的命令,工作正常。就像我说的,它应该启动多个新终端,为此我设置了一个 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"
我的问题是,当它启动第一个新终端时,该新终端将成为“活动”终端,并且它不会返回到原始脚本来完成循环并启动其他终端。有没有办法释放新终端并完成循环以启动其他终端?
当然,只需在命令后添加
&
即可将循环中的进程设置为后台:
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。
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
会导致终端进程不会分叉到后台。如果它分叉,它只会同时启动所有内容,从而否定我们的作业控制尝试。