あなたがあなたの特定の状況の問題を解決したと述べたので、一般的な目的のための解決策の下に。xdotool
の--sync
オプションのおかげで、実行したテストでかなり信頼性の高い動作をします。特定のターミナルウィンドウにコマンドを「送信」でき、例外なく完全に実行されました。
実際の仕組み
解決策は2つのオプションが実行できるスクリプトから存在する
-set
と-run
:
この例3で、任意の数のターミナルウィンドウをセットアップ(開く)するには:
target_term -set 3
3つの新しいターミナルが開き、それらのウィンドウIDは隠しファイルに記憶されます。
明確にするために、端末ウィンドウを最小化してからコマンドを実行しました:)
3つのウィンドウを作成したので、runコマンド(たとえば)を使用して、いずれかのウィンドウにコマンドを送信できます。
target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
以下に示すように、コマンドは2番目のターミナルで実行されました。
その後、最初の端末にコマンドを送信できます。
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
、スクリプトのheadセクションを変更することにより、任意の端末(または他のプログラム)に使用できます。
#--- set your terminal below
application = "gnome-terminal"
#---
- 上記のコマンドは(もちろん)何らかのシミュレーションに使用したい場合に備えて、スクリプトからも実行できます。
- スクリプトは、ターゲットウィンドウにフォーカスがあり、コマンドの入力が完了するまで待機するため、コマンドは常に正しいターミナルウィンドウに表示されます。
スクリプトは、コマンドによって呼び出されたターミナルセットアップ(ウィンドウ)でのみ機能することを言う必要はありません。
target_term -set
ターミナルウィンドウは、質問で言及したように、スクリプトによって「ラベル付け」されます。
- 新しい
target_term
セッションを開始する場合、スクリプトによって作成された隠しファイルは単純に上書きされるため、削除する必要はありません。