Digamos que eu tenha top
algum programa ncurses rodando em um terminal gráfico, e de fora desse terminal eu gostaria de executar um comando, que substituiria top
por outro programa de minha escolha.
Imagino que haja uma abordagem genérica para isso, algo que
- encontra o PTY para a janela correta
- mata o programa no terminal, mantendo o PTY
- Gera o comando de substituição e
- conecta E/S PTY para ler/escrever de/para o comando
Minha pesquisa no Google por soluções genéricas preexistentes para embrulhar isso não rendeu ponteiros úteis.
O caso de uso específico que tenho para isso: quero alternar o cliente tmux em execução no gnome-terminal de um /tmp/tmux-$UID/Socket (=servidor) para outro pertencente ao mesmo usuário, sem "perder" a janela.
Estou procurando a solução genérica, porque não consegui que um tmux-client conectado se conectasse/anexasse a um novo soquete em tempo de execução.
Que eu saiba, não há solução genérica para fazer isso. O cliente tmux está sendo executado em um pty que pertence ao gnome-terminal, você não pode alterar o pty com o qual o gnome-terminal está falando ou alterar o programa ao qual o pty pertence (seja o mestre ou o escravo) sem a participação do gnome-terminal ou sem algum código seriamente complicado (por exemplo, veja reptyr, que faz o inverso do que você deseja - mover um programa para um pty diferente em vez de um pty para um programa diferente).
Para o tmux especificamente, se o seu tmux for novo o suficiente (2.4 ou posterior), você pode usar
detach-client -E
para substituir o cliente tmux em execução por um processo diferente - pode ser outro cliente tmux, por exemplo:Se o seu tmux não for novo o suficiente, suas opções provavelmente estão limitadas a:
abra uma nova aba no gnome-terminal com o novo cliente tmux e feche a aba original;
feche totalmente o seu gnome-terminal e abra outro com o programa que você deseja;
abra o novo tmux dentro do antigo tmux e, em seguida, oculte a linha de status e desative o prefixo no antigo tmux, para que ele ainda esteja em execução, mas não atrapalhe.
O problema com emuladores de terminal é que eles fecharão, quando o executável que eles geraram sair. Mas você pode executar um pequeno wrapper dentro do emulador de terminal que irá:
Algo como esta pequena essência . Você salva os arquivos em um diretório, pode compilar o servidor com:
e o cliente com:
Você executa o servidor em um terminal:
e trocar comandos pelo cliente em outro: