Bahsettiğinizden, genel durum için bir çözümün altında, özel durumunuz için sorunu çözdüğünüzden emin olun. Sayesinde xdotool
bireyin --sync
seçeneği, bu Koştum testlerde oldukça güvenilir çalışır; Belirli terminal pencerelerine "gönderebilir" ve istisnasız mükemmel çalıştı.
Pratikte nasıl çalışır?
Çözelti iki seçenekli çalıştırılabilir Filmin senaryosu ise mevcut
-set
ve -run
:
İçin ayarlanmış Bu örnek 3'te, uç pencere rasgele bir sayı (açık) kadar:
target_term -set 3
Üç yeni terminal açılacak, pencere kimlikleri gizli bir dosyada hatırlanacak:
Açıklık nedeniyle, terminal penceresini simge durumuna küçültdüm.
Şimdi üç pencere oluşturduğumdan, çalıştır komutuyla bunlardan birine komut gönderebilirim (örn.):
target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
Aşağıda gösterildiği gibi, komut ikinci terminalde koştu:
Daha sonra, ilk terminale bir komut gönderebilirim:
target_term -run 1 sudo apt-get update
yapmada sudo apt-get update
Terminal 1 çalıştırmak:
ve bunun gibi...
Nasıl kurulur
Senaryo hem ihtiyacı wmctrl
ve xdotool
:
sudo apt-get install wmctrl xdotool
Aşağıdaki komut dosyasını boş bir dosyaya kopyalayın ( gerekirse dizini oluşturun target_term
) içinde ~/bin
( uzantı yok!)~/bin
Komut dosyasını yürütülebilir yapın (unutmayın) ve oturumu kapatın / oturum açın veya çalıştırın:
source ~/.profile
Şimdi terminal pencerelerinizi bağımsız değişken olarak gerekli pencerelerin sayısı ile ayarlayın:
target_term -set <number_of_windows>
Şimdi şu komutlarla terminallerden birine "gönderebilirsiniz":
target_term -run <terminal_number> <command_to_run>
Senaryo
#!/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)
notlar
Betik ayarlanmıştır gnome-terminal
, ancak application
betiğin baş bölümü değiştirilerek herhangi bir terminal (veya başka bir program için) kullanılabilir :
#--- set your terminal below
application = "gnome-terminal"
#---
- Yukarıdaki komutlar (tabii ki) bir tür simülasyon için kullanmak istediğinizde komut dosyasından da çalıştırılabilir.
- Komut dosyası, hem hedeflenen pencere odaklanana hem de komut yazılıncaya kadar bekler, böylece komut her zaman sağ terminal penceresine iner.
Komut dosyasının yalnızca komut tarafından çağrılan terminal kurulumu (windows) ile çalıştığını söylemeye gerek yok:
target_term -set
Terminal pencereleri, sorunuzda belirttiğiniz gibi komut dosyası tarafından "etiketlenecektir".
- Yeni bir
target_term
oturum başlatırsanız , komut dosyası tarafından oluşturulan gizli dosyanın üzerine yazılır, aksi takdirde oturumun kaldırılmasına gerek yoktur.