假设我有top
或一些 ncurses 程序在图形终端中运行,并且我想从该终端外部执行一个命令,该命令将替换top
为我选择的另一个程序。
我想有一个通用的方法来解决这个问题,
- 找到正确窗口的 PTY
- 杀死终端中的程序,同时保留 PTY
- 产生替换命令,并且
- 连接 PTY I/O 以读取/写入/从命令
我在谷歌上搜索现有的通用解决方案来包装它并没有产生有用的指针。
我对此的具体用例:我想将在 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 不够新,您的选择可能仅限于:
使用新的 tmux 客户端在 gnome-terminal 中打开一个新选项卡并关闭原始选项卡;
完全关闭您的 gnome-terminal 并使用您想要的程序打开另一个;
在旧 tmux 中打开新 tmux,然后隐藏状态行并取消设置旧 tmux 中的前缀,因此它仍在运行但不会妨碍。
终端仿真器的问题在于,当它们生成的可执行文件退出时,它们将关闭。但是您可以在终端模拟器中运行一个小包装器,它将:
像这个小要点。您将文件保存在一个目录中,可以使用以下命令编译服务器:
和客户:
您在一个终端中运行服务器:
并通过客户端在另一个中切换命令: