如何在 shell 脚本中启动多个 Gnome 终端窗口并仅在这些窗口完成后继续

如何在 shell 脚本中启动多个 Gnome 终端窗口并仅在这些窗口完成后继续

在脚本中,我想要启动多个 Gnome 终端窗口,然后仅在窗口关闭时继续执行脚本。

我有一个 shell 脚本,其中包含:

command 1

gnome-terminal ./script 1
gnome-terminal ./script 2
gnome-terminal ./script 3

command 2
command 3

如果我运行它,所有gnome-terminal命令都会立即执行,然后command 2执行command 3 和。我怎样才能使command 2command 3仅在所有gnome-terminal命令完成后运行?

答案1

gnome-terminal --wait command成功了。(如果它不支持该--wait选项,那么它出现在更高版本的 gnome-terminal 中。我猜它大约从 Ubuntu 20.04 开始可用。)


不过,我要说的是,我发现从 shell 脚本打开终端仿真器(更不用说更多终端仿真器)是一种非常糟糕的做法。你几乎找不到这样的例子,尤其是在高质量代码、与他人共享的代码中。(首先:如果你不是脚本的唯一用户,终端如何知道用户喜欢哪个终端仿真器?你的眼睛如何跟随终端的随机位置?如果终端自动关闭,你如何检查命令的输出?)

这不是你的脚本的工作。

手动打开您喜欢的终端仿真器,启动您喜欢的 shell。您可以在其中做很多事情,包括运行脚本,这样脚本下面就已经有一个终端,您就不必费心打开它了。也就是说,设计您的脚本,使其完全按照系统上所有其他基于终端的脚本和工具的运行方式运行。脚本完成后,您可以在终端中检查其输出,也可以在那里执行后续操作。

可选择设置一个终端仿真器配置文件,用于自动启动给定的脚本,或者创建一个在终端内运行给定脚本的桌面图标(在这种情况下,您的桌面环境将使用您的脚本启动终端——从技术上讲,它很可能是由一个.desktop带有一行的文件备份的Terminal=true)。

答案2

为了实现您想要的效果,即生成多个 Gnome 终端窗口,并且仅在所有这些窗口终止后才继续执行脚本,请使用以下构造:

...
gnome-terminal --wait -- command 1 &
gnome-terminal --wait -- command 2 &
gnome-terminal --wait -- command 3 &
wait
command 4

一些解释:Gnome 终端与服务器/客户端系统配合使用,这就是为什么“gnome-terminal”命令通常会立即释放终端。该--wait选项将导致终端等待,直到其子进程退出。这会导致脚本也等待,除非我们将进程发送到后台并附加“与”符号&

然后我们使用 shell 内置函数wait。这会导致 shell 等待所有处理完成。因此,只有当所有终端都关闭后,脚本才会继续执行。

相关内容