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

时间:2017-04-12 18:32:23

标签: linux bash shell command-line scripting

我想运行一组命令,其中一些我希望使用shelll脚本在另一个终端中同时运行。我们说我有以下四个命令

command1
command2
command3
command4

首先,我想在终端1&中启动command1当它继续执行时(它会在一段时间内从服务器轮询数据)我希望command2在终端2中开始执行。然后当comamnd1完成时我希望command3开始执行终端1&类似地,当command2完成command4时应该从终端2开始。我需要两个终端,因为我需要监视两组命令的输出。如何使用shell脚本实现这一目标?是否也可以找到一个独立于终端程序的解决方案,以便任何人都可以获取脚本并在他们的机器上运行?

4 个答案:

答案 0 :(得分:-1)

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

例如:

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

答案 1 :(得分:-1)

您描述需求的方式,init(configuration:)URLSession以及command3command1的依赖关系,但这些依赖于两组命令没有互动。

处理这个问题的一个简单方法是使用两个单独的脚本,手动打开两个终端(使用您选择的终端模拟器),然后分别启动这两个脚本,每个窗口一个,这看起来像这样: / p>

<强> SCRIPT1

command4

<强> SCRIPT2

command2

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

#!/bin/bash
command1
command3

我想这不是你想要的。您可能需要在GUI中使用两个终端窗口。不幸的是,没有通用的方法来实现这一点,因为我们不知道您的操作系统和终端程序是什么。如果终端不在与脚本相同的机器上执行(除非您使用GNU #!/bin/bash command2 command4 或其他终端多路复用实用程序,首先创建终端,然后从另一台机器连接到终端),这将无法实现。 / p>

答案 2 :(得分:-1)

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

# 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

答案 3 :(得分:-1)

如果您熟悉python,可以查看Python pexpect模块(https://pexpect.readthedocs.io/en/stable/)。也许这对你想做的事情来说太过分了,但正如你提到的那样你想监视两个终端的输出,pexpect可能非常适合你。