X11
如何用另一個程序替換圖形終端中執行的程序?
假設我有
top
或一些 ncurses 程序在圖形終端中執行,並且我想從該終端外部執行一個命令,該命令將替換top
為我選擇的另一個程序。我想有一個通用的方法來解決這個問題,
- 找到正確視窗的 PTY
- 殺死終端中的程序,同時保留 PTY
- 產生替換命令,並且
- 連接 PTY I/O 以讀取/寫入/從命令
我在Google上搜尋現有的通用解決方案來包裝它並沒有產生有用的指針。
我對此的具體案例:我想將在 gnome-terminal 中執行的 tmux 客戶端從一個 /tmp/tmux-$UID/Socket (=server) 切換到另一個屬於同一使用者的客戶端,而不會“失去”窗戶。
我正在尋找通用解決方案,因為我無法讓連接的 tmux-client 在執行時連接/附加到新套接字。
據我所知,沒有通用的解決方案可以做到這一點。tmux 客戶端執行在屬於 gnome-terminal 的 pty 中,如果沒有 gnome-terminal 的參與,您無法更改 gnome-terminal 正在與之交談的 pty 或更改 pty 所屬的程序(主端或從端)或沒有一些非常繁瑣的程式碼(例如,請參閱 reptyr,它與您想要的相反 - 將程序移動到不同的 pty 而不是將 pty 移動到不同的程序)。
特別是對於 tmux,如果您的 tmux 足夠新(2.4 或更高版本),您可以使用
detach-client -E
不同的程序替換正在執行的 tmux 客戶端 - 這可能是另一個 tmux 客戶端,例如:tmux -Lfirstsocket detach -E 'tmux -Lsecondsocket attach'
如果您的 tmux 不夠新,您的選擇可能僅限於:
- 使用新的 tmux 客戶端在 gnome-terminal 中打開一個新選項卡並關閉原始選項卡;
- 完全關閉您的 gnome-terminal 並使用您想要的程序打開另一個;
- 在舊 tmux 中打開新 tmux,然後隱藏狀態行並取消設置舊 tmux 中的前綴,因此它仍在執行但不會妨礙。