自从您提到以来,您已针对自己的具体情况解决了该问题,下面提供了一个通用解决方案。多亏了xdotool
的--sync
选择,它在我运行的测试中仍然非常可靠;我可以将命令“发送”到特定的终端窗口,并且运行无异常。
在实践中如何运作
该解决方案由一个脚本,它可以与两个选项运行中存在
-set
和-run
:
要设置(打开)任意数量的终端窗口,在此示例中:3
target_term -set 3
将打开三个新的终端,它们的窗口ID会在一个隐藏文件中被记住:
为了清楚起见,我最小化了终端窗口:
现在,我创建了三个窗口,我可以使用run命令(例如)将命令发送到其中一个:
target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
如下所示,该命令在第二个终端中运行:
随后,我可以向第一个终端发送命令:
target_term -run 1 sudo apt-get update
使sudo apt-get update
运行在终端1:
等等...
如何设定
该脚本同时需要wmctrl
和xdotool
:
sudo apt-get install wmctrl xdotool
将以下脚本复制到一个空文件中,将其安全保存为target_term
(无扩展名!)~/bin
(在~/bin
必要时创建目录)中。
使脚本可执行(不要忘记),然后注销/登录或运行:
source ~/.profile
现在,以所需的窗口数作为参数来设置终端窗口:
target_term -set <number_of_windows>
现在,您可以使用以下命令将命令“发送”到任一终端:
target_term -run <terminal_number> <command_to_run>
剧本
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
#--- set your terminal below
application = "gnome-terminal"
#---
option = sys.argv[1]
data = os.environ["HOME"]+"/.term_list"
def current_windows():
w_list = subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8")
w_lines = [l for l in w_list.splitlines()]
try:
pid = subprocess.check_output(["pgrep", application]).decode("utf-8").strip()
return [l for l in w_lines if str(pid) in l]
except subprocess.CalledProcessError:
return []
def arr_windows(n):
w_count1 = current_windows()
for requested in range(n):
subprocess.Popen([application])
called = []
while len(called) < n:
time.sleep(1)
w_count2 = current_windows()
add = [w for w in w_count2 if not w in w_count1]
[called.append(w.split()[0]) for w in add if not w in called]
w_count1 = w_count2
return called
def run_intterm(w, command):
subprocess.call(["xdotool", "windowfocus", "--sync", w])
subprocess.call(["xdotool", "type", command+"\n"])
if option == "-set":
open(data, "w").write("")
n = int(sys.argv[2])
new = arr_windows(n)
for w in new:
open(data, "a").write(w+"\n")
elif option == "-run":
t_term = open(data).read().splitlines()[int(sys.argv[2])-1]
command = (" ").join(sys.argv[3:])
run_intterm(t_term, command)
笔记
将该脚本设置为gnome-terminal
,但可以通过更改application
脚本头部的将该脚本用于任何终端(或其他程序):
#--- set your terminal below
application = "gnome-terminal"
#---
- 上面的命令(当然)也可以从脚本运行,以防您愿意将其用于某种模拟。
- 该脚本将一直等待,直到目标窗口都具有焦点并且命令完成键入为止,因此该命令将始终位于正确的终端窗口中。
无需说该脚本仅适用于命令调用的终端设置(Windows):
target_term -set
就像您在问题中提到的那样,终端窗口将由脚本“标记”。
- 万一您开始一个新的
target_term
会话,由脚本创建的隐藏文件将被简单地覆盖,因此不需要删除它。