Linux 如何使用shell脚本生成新的终端并在其上运行一些命令?

Linux 如何使用shell脚本生成新的终端并在其上运行一些命令?,linux,bash,shell,command-line,scripting,Linux,Bash,Shell,Command Line,Scripting,我想运行一组命令,其中一些命令我想使用shell脚本在另一个终端中同时运行。假设我有以下四个命令 command1 command2 command3 command4 首先,我想在终端1中启动command1&当它持续执行它时,我想让command2在终端2中开始执行。然后,当comamnd1完成时,我想让command3在终端1中启动&同样,当command2完成时,command4应该在终端2中启动。我需要两个终端,因为我需要监视两组命令的输出。如何使用shell脚本实现这一点?是否也可

我想运行一组命令,其中一些命令我想使用shell脚本在另一个终端中同时运行。假设我有以下四个命令

command1
command2
command3
command4

首先,我想在终端1中启动command1&当它持续执行它时,我想让command2在终端2中开始执行。然后,当comamnd1完成时,我想让command3在终端1中启动&同样,当command2完成时,command4应该在终端2中启动。我需要两个终端,因为我需要监视两组命令的输出。如何使用shell脚本实现这一点?是否也可以找到独立于终端程序的解决方案,以便任何人都可以使用脚本并在其机器上运行?

您可以编写两个shell脚本,为各自的终端执行各自的任务。然后,如果您想使用python,您可以使用它独立地调用每个命令。此方法不会等待进程完成,您可以告诉它在shell中运行它们

例如:

result1 = subprocess.Popen('command1and3.sh', shell=True)
result2 = subprocess.Popen('command2and4.sh', shell=True)

按照您描述需求的方式,command3与command1之间存在依赖关系,command4与command2之间存在依赖关系,但它们形成了两组不交互的命令

一种简单的处理方法是使用两个单独的脚本,使用您选择的终端仿真器手动打开两个终端,然后分别启动这两个脚本,每个窗口一个,如下所示:

#!/bin/bash
{ command1 ; command3 ; } >/path/to/log1 2>&1 &
{ command2 ; command4 ; } >/path/to/log2 2>&1 &
脚本1

脚本2

另一件非常简单的事情是在一个脚本中启动所有内容,但让这两个集分别执行,将它们的输出发送到不同的日志文件,这样可以避免在同一个终端中混合它们,但也会隐藏它们。它看起来是这样的:

#!/bin/bash
{ command1 ; command3 ; } >/path/to/log1 2>&1 &
{ command2 ; command4 ; } >/path/to/log2 2>&1 &

不过,我想这不是你想要的。您可能希望GUI中有两个终端窗口。不幸的是,由于我们不知道您的操作系统和终端程序是什么,因此没有通用的方法来实现这一点。如果终端与脚本不在同一台机器上执行,则这是不可能的,除非您使用GNU屏幕或另一个终端多路复用实用程序,首先创建一个终端,然后从另一台机器连接到它。

这里有一个替代方案,只使用一个终端窗口,但是,在所有输出行前面加上命令名,以便您可以轻松查看它们的来源:

# start command1 in background
command1 &
# start command2, prefixing all output with its name
command2 | sed 's/^/COMMAND2: /'
# wait till finished
wait

command3 &
command4 | sed 's/^/COMMAND4: /'
wait

如果您熟悉python,那么可以看看python pexpect模块。也许这对于您想要做的事情来说太多了,但是正如您提到的,您想要监控两个终端的输出,pexpect可能非常适合您。

这对我来说就像是一个问题。这样做的目的是什么?在同一个shell/同一个主进程中启动所有命令可能更简单,但将它们的输出写入不同的文件,并以不同的方式跟踪每个输出文件terminal@SimonFraser到目前为止,我只是在做这项工作。但我想知道是否有任何使用任何语言的解决方案。实际上,启动更多图形终端似乎更复杂,也更容易失败,但如果您想这样做,那么,如果您正在使用xterm,请运行终端应用程序-xterm-e command2,而不只是运行command2或类似程序,如果不是,则取决于您拥有的终端应用程序,这就是复杂性的来源。使用屏幕可能是一种可能的解决方案,请参阅:它不会打开两个终端。这两个脚本在一个终端上同时运行,弄乱了两个脚本的输出。是的,我必须同意@oshaiken,我发现打印到终端是一种值得怀疑的跟踪方法。如果需要记录器,请启动记录器,如果需要错误报告,请将其写入文件。但打印到终端感觉不对劲。它不是永久性的,并且容易发生用户错误。到目前为止,我只从文件中读取输出。但我只是想知道是否存在任何通用的方法来生成一个新的终端,并在该终端上运行一些独立于终端应用程序的命令。
# start command1 in background
command1 &
# start command2, prefixing all output with its name
command2 | sed 's/^/COMMAND2: /'
# wait till finished
wait

command3 &
command4 | sed 's/^/COMMAND4: /'
wait