Vì bạn đề cập bạn đã giải quyết vấn đề cho tình huống cụ thể của mình, bên dưới một giải pháp cho mục đích chung. Nhờ xdotool
's --sync
lựa chọn, nó hoạt động khá đáng tin cậy trong các bài kiểm tra tôi chạy; Tôi có thể "gửi" các lệnh đến các cửa sổ đầu cuối cụ thể và nó chạy hoàn hảo mà không có ngoại lệ.
Làm thế nào nó hoạt động trong thực tế
Giải pháp tồn tại từ một tập lệnh, có thể được chạy với hai tùy chọn
-set
và -run
:
Để thiết lập (mở) số lượng cửa sổ đầu cuối tùy ý, trong ví dụ 3 này:
target_term -set 3
Ba thiết bị đầu cuối mới sẽ mở ra, id cửa sổ của chúng được ghi nhớ trong một tệp ẩn:
Vì lý do rõ ràng, tôi thu nhỏ cửa sổ terminal, tôi chạy lệnh từ :)
Bây giờ tôi đã tạo ba cửa sổ, tôi có thể gửi lệnh đến một trong số chúng bằng lệnh run (vd):
target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
Như được hiển thị bên dưới, lệnh chạy trong thiết bị đầu cuối thứ hai:
Sau đó, tôi có thể gửi lệnh đến thiết bị đầu cuối đầu tiên:
target_term -run 1 sudo apt-get update
tỉ số giờ sudo apt-get update
chạy trong terminal 1:
và như thế...
Làm thế nào để thiết lập
Kịch bản cần cả hai wmctrl
và xdotool
:
sudo apt-get install wmctrl xdotool
Sao chép tập lệnh bên dưới vào một tệp trống, an toàn dưới dạng target_term
(không có phần mở rộng!) Trong ~/bin
(tạo thư mục ~/bin
nếu cần.
Làm cho tập lệnh có thể thực thi được (đừng quên) và đăng xuất / đăng nhập hoặc chạy:
source ~/.profile
Bây giờ hãy thiết lập các cửa sổ đầu cuối của bạn, với số lượng cửa sổ cần thiết làm đối số:
target_term -set <number_of_windows>
Bây giờ bạn có thể "gửi" các lệnh đến một trong các thiết bị đầu cuối của mình bằng lệnh:
target_term -run <terminal_number> <command_to_run>
Kịch bản
#!/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)
Ghi chú
Tập lệnh được đặt cho gnome-terminal
, nhưng có thể được sử dụng cho bất kỳ thiết bị đầu cuối nào (hoặc chương trình khác) bằng cách thay đổi application
phần đầu của tập lệnh:
#--- set your terminal below
application = "gnome-terminal"
#---
- Tất nhiên, các lệnh trên có thể được chạy từ một tập lệnh trong trường hợp bạn không muốn sử dụng nó cho một loại mô phỏng nào đó.
- Kịch bản chờ cho đến khi cả hai cửa sổ được nhắm mục tiêu tập trung và lệnh được gõ xong, vì vậy lệnh sẽ luôn hạ cánh trong cửa sổ đầu cuối bên phải.
Không cần phải nói rằng tập lệnh chỉ hoạt động với thiết lập đầu cuối (windows) được gọi bởi lệnh:
target_term -set
Các cửa sổ đầu cuối sau đó sẽ được "dán nhãn" bởi tập lệnh, như bạn đề cập trong câu hỏi của mình.
- Trong trường hợp bạn bắt đầu một
target_term
phiên mới , tệp ẩn, được tạo bởi tập lệnh sẽ chỉ bị ghi đè, do đó không cần phải xóa nó đi.