चूंकि आप उल्लेख करते हैं कि आपने सामान्य उद्देश्य के समाधान के लिए, अपनी विशिष्ट स्थिति के लिए समस्या का समाधान किया है। के लिए धन्यवाद xdotool
के --sync
विकल्प, यह परीक्षण मैं भागा में बहुत विश्वसनीय काम करता है; मैं विशिष्ट टर्मिनल विंडो पर "कमांड" भेज सकता था और यह बिना किसी अपवाद के पूरी तरह से चलता था।
यह व्यवहार में कैसे काम करता है
समाधान एक स्क्रिप्ट से मौजूद है, जिसे दो विकल्पों के साथ चलाया जा सकता है
-set
और -run
:
करने के लिए सेट इस उदाहरण 3 में टर्मिनल खिड़कियों की एक मनमाना संख्या अप (खुला),:
target_term -set 3
तीन नए टर्मिनल खुलेंगे, उनकी विंडो आईडी को एक छुपी हुई फ़ाइल में याद किया जाएगा:
स्पष्टता के कारणों से मैंने टर्मिनल विंडो को छोटा कर दिया जिससे मैंने कमांड चलाया :)
अब जब मैंने तीन विंडो बनाईं, तो मैं रन कमांड के साथ उनमें से किसी एक को कमांड भेज सकता हूं (जैसे):
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"
#---
- ऊपर दिए गए आदेश (निश्चित रूप से) एक स्क्रिप्ट से चलाए जा सकते हैं और साथ ही साथ आप इसे किसी प्रकार के सिमुलेशन के लिए उपयोग करने के लिए lile करेंगे।
- स्क्रिप्ट तब तक इंतजार करती है जब तक दोनों लक्षित विंडो पर ध्यान केंद्रित नहीं किया जाता है और कमांड टाइपिंग किया जाता है, इसलिए कमांड हमेशा सही टर्मिनल विंडो में लैंड करेगा।
यह कहने की ज़रूरत नहीं है कि स्क्रिप्ट केवल टर्मिनल सेटअप (विंडोज़) के साथ काम करती है जिसे कमांड द्वारा बुलाया गया था:
target_term -set
टर्मिनल विंडो को स्क्रिप्ट द्वारा "लेबल" किया जाएगा, जैसे कि आप अपने प्रश्न में उल्लेख करते हैं।
- यदि आप एक नया
target_term
सत्र शुरू करते हैं , तो स्क्रिप्ट द्वारा बनाई गई छिपी हुई फ़ाइल बस ओवरराइट हो जाएगी, इसलिए इसे अन्यथा हटाने की कोई आवश्यकता नहीं है।