언급 했으므로 특정 상황에서 문제를 해결하기 위해 범용 솔루션 아래에서 설명했습니다. xdotool
의 --sync
옵션 덕분에 내가 실행 한 테스트에서 매우 안정적으로 작동합니다. 특정 터미널 창에 명령을 "전송"할 수 있었고 예외없이 완벽하게 실행되었습니다.
실제로 작동하는 방식
이 솔루션은 두 가지 옵션을 실행할 수있는 스크립트에서 존재
-set
하고 -run
:
이 예제에서 임의의 수의 터미널 창 을 설정 (열기) 하려면
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
의 head 섹션에서 를 변경하여 모든 터미널 (또는 다른 프로그램)에 사용할 수 있습니다 .
#--- set your terminal below
application = "gnome-terminal"
#---
- 위의 명령은 물론 어떤 종류의 시뮬레이션에 사용하기 위해 스크립트에서 실행할 수도 있습니다.
- 스크립트는 대상 창 모두에 초점이 있고 명령 입력이 완료 될 때까지 대기하므로 명령은 항상 오른쪽 터미널 창에 들어갑니다.
스크립트가 명령에 의해 호출 된 터미널 설정 (windows)에서만 작동한다고 말할 필요는 없습니다.
target_term -set
그러면 질문에서 언급 한 것처럼 터미널 창에 스크립트가 "라벨"로 표시됩니다.
- 새
target_term
세션 을 시작하는 경우 스크립트로 만든 숨겨진 파일을 덮어 쓰므로 제거 할 필요가 없습니다.