假设我有top
一个或某个 ncurses 程序在图形终端中运行,并且我想从该终端外部执行一个命令,该命令将替换top
为我选择的另一个程序。
我想有一个通用的方法可以解决这个问题
- 找到正确窗口的 PTY
- 终止终端中的程序,同时保留 PTY
- 生成替换命令,并且
- 连接 PTY I/O 以从命令读取/写入
我在谷歌上搜索现有的通用解决方案来包装此问题,但没有产生有用的指针。
我对此的具体用例:我想将 gnome-terminal 中运行的 tmux 客户端从一个 /tmp/tmux-$UID/Socket (=server) 切换到属于同一用户的另一个客户端,而不会“丢失”窗户。
我正在寻找通用解决方案,因为我无法让已连接的 tmux 客户端在运行时连接/附加到新套接字。
答案1
据我所知,没有通用的解决方案可以做到这一点。 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 终端,然后用你想要的程序打开另一个终端;
在旧 tmux 中打开新 tmux,然后隐藏状态行并取消旧 tmux 中的前缀设置,因此它仍在运行,但不会妨碍。
答案2
终端模拟器的问题是,当它们生成的可执行文件退出时,它们将关闭。但是您可以在终端模拟器内运行一个小包装器,它将:
- 从 UNIX 套接字接收命令,
- 执行它,
- 当新消息到达时终止该命令。
- 转到1。
像这样的东西小要点。您将文件保存在目录中,可以使用以下命令编译服务器:
gcc -Wall -o server libwrapper.c server.c
和客户:
gcc -Wall -o client libwrapper.c client.c
您在一个终端中运行服务器:
./server
并在另一个客户端中通过客户端切换命令:
./client /bin/cat /etc/motd