linux - 打开终端,运行命令,稍后返回 SAME 终端并执行另一个命令

标签 linux bash

*请注意,我正在尝试自动执行此操作,以便全部通过脚本完成。显然,我可以轻松地手动完成此操作。

编辑

在更好地理解问题之后,我可以更好地提出这个问题。我正在尝试将命令写入给定终端的标准输入。它们需要在该终端中被接受并作为命令运行。

我需要做什么:

我需要从 shell 脚本打开一个终端。我们将其称为终端 1。我需要从终端 1 运行命令。

然后,我需要打开第二个终端(终端 2)并运行第二个命令并等待该命令运行完成。

现在的问题是,我如何RETURN 到终端 1 并从该终端执行另一个命令? (然后我需要返回到终端 2 并执行另一个命令,但这应该是与此答案相同的过程)。

必须有某种方法在实例化时为终端实例保留进程 ID

gnome-terminal -e *command* <something to get PID of resulting terminal here?>

我找到的相关答案(没有我要找的一切):

免责声明

我使用 Linux 已经有一段时间了,并且很乐意使用终端进行工作。然而,这是我以前从未尝试过的事情。如果我只是遗漏了一些关于终端如何运行的基本知识,请指出必要资源的方向以加快速度。

最佳答案

为了从另一个程序或终端向终端写入命令,您必须使用系统输入输出控制系统调用 (ioctl)。 (情况可能并非总是如此,但这是我找到的解决方案)。我还将展示一个 Python 解决方案,但我引用了其他资源,包括下面的 c 语言方法。

首先,您需要要向其发送命令以使其执行的终端实例的进程标识符 (PID)。这可以通过几种方式确定,但我发现最简单的方法是通过以下命令:

ps -A | grep bash --color=always

这将输出打开的终端及其 PID 和 pts 编号的列表。我发现知道哪个是你想要的最简单的方法是通过你的程序打开一个终端,运行上述命令,最近打开的终端将是列表中的最后一个。我敢肯定,如果您需要确定的话,您会更喜欢它,但这不是这个问题的重点。你会看到类似这样的东西,其中 pts/# 就是你想要的

108514 pts/2    00:00:00 bash

接下来使用以下代码,并将其简单地保存到您选择的 .py 文件中(此代码的功劳来自下面第一个链接中的答案,即 Python 链接)。请注意,下面的示例被硬编码为发送“ls”命令。同样,根据您自己的偏好和用例,更改硬编码命令或使其不硬编码。

import fcntl
import sys
import termios

with open(sys.argv[1], 'w') as fd:
    for c in "ls\n":
        fcntl.ioctl(fd, termios.TIOCSTI, c)

然后,只需调用新函数并根据之前找到的 pts 编号将其传递到以下路径,如下所示:

python <your_fcn_name_here).py /dev/pts/#

我在 Ubuntu 14.04 上运行良好。我很快就会在 CentOS 上试用它。无需安装任何 python 库即可完成。

其他资源

这个问题在这里以不同的方式提出:

有关 IOCTL 的更多有用信息:

关于linux - 打开终端,运行命令,稍后返回 SAME 终端并执行另一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802812/

相关文章:

bash - 正确转义 sed 字符串

c - 使用 C,if 语句不起作用(使用 fork 和子进程来运行程序的某些部分)

linux - 如何卸载使用 Appimage Launcher 安装的程序?

linux - 读取 INI 文件 perl 中的新格式

linux - 基于文件系统中位置的 Shell 提示符

linux - 在Linux中查找某个文件并打印其创建和修改时间

bash - Ubuntu 上列出所有信号的 bash 命令是什么?

linux - 如何将另一个脚本的输出编码为其他脚本中的 in 条件

linux - 如何在 bash 中使用 $find 命令抑制文件夹排序

git - 如何让我的 git(Windows 上的 msysgit)提交后脚本将我的 python 脚本作为 python 而不是 bash 调用?