Impedir que o painel / janela se feche quando o comando for concluído - tmux

33

No meu tmux.confarquivo, eu o configurei para abrir janelas, nomeá-las, painéis de configuração etc.

No entanto, um problema que tenho é que, se um dos painéis iniciar um comando, digamos ls, o painel se fechará após o comando ser concluído (instantaneamente). Existe alguma maneira de impedir esse comportamento? Ou ele caiu para um shell normal após a conclusão de um comando?

Estou assumindo que preciso iniciar um comando shell -> execute quando o painel for iniciado, mas ficarei condenado se conseguir descobrir como. Pesquisei um pouco sobre esse problema, mas não consegui.

Estufado
fonte

Respostas:

22

Você tem algumas opções.

  1. Em vez de executar lsna sua janela, execute um shell e envie as teclas pressionadas para executar:

    tmux start-server  
    tmux new-session -d -s session  
    tmux new-window -t session:1  
    tmux send-keys -t session:1 ls C-m
    
  2. Você pode almoçar uma sequência de comandos de forma a deixar-se com um shell bash após a execução de outros comandos:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'ls;bash -i'
    
  3. Consulte a resposta de jasonwryan para obter detalhes sobre a remain-on-exitopção de manter os painéis vivos após a conclusão do processo para que você possa revisar a saída.

  4. Se a saída de algum comando valeu a pena ver uma vez, pode valer a pena atualizar. Se você estiver monitorando a saída de algo, poderá watchobter periodicamente nova saída. Isso deve funcionar bem com painéis em tmux:

    tmux start-server  
    tmux new-session -d
    tmux new-window 'watch -n 60 ls'
    
Caleb
fonte
Valeu cara! Resposta impressionante, número 2 e número 4 são exatamente o que eu estava trabalhando, mas o número 1 parece ser uma ótima alternativa também. Obrigado por toda a ajuda, é realmente apreciado (vocês dois).
Guisado
1
A vantagem do número 1 é que o comando permanece no histórico do shell e pode ser facilmente reexecutado. Se o comando foi grande e feio, isso é muito útil.
goertzenator
1
Está funcionando para mim sem o start-servercomando, acho que é iniciado automaticamente, se necessário. Existe uma vantagem de chamá-lo explicitamente, no entanto?
luator
1
@luator Acho que a inicialização automática de um servidor, se nenhum for encontrado, pode ter sido adicionada tmuxdesde que escrevi esta resposta. Não tenho nenhuma vantagem se sua versão gerar um processo de servidor, se necessário.
Caleb
13

Você pode usar a remain-on-exitopção:

permanecer na saída [ligado | off]
Uma janela com este conjunto de sinalizadores não é destruída quando o programa em execução sai. A janela pode ser reativada com o comando respawn-window.

Para simplificar o processo de reaparecimento, convém vinculá-lo a uma chave:

bind-key R respawn-window

Isso garantirá que você não fique com janelas mortas quando os programas forem encerrados.

jasonwryan
fonte
Eu estava chegando lá! Acabei o tempo e decidi que teria que editar minha resposta. Sim, esta é a terceira opção, a principal desvantagem é que ela deixa uma janela somente leitura que você não pode reutilizar sem recriar.
21711 Caleb
Bom ponto. Eu atualizei com uma (semi-) solução alternativa.
jasonwryan
Funciona com painéis?
azmeuk
1
definir isso a partir da linha de comando pode ser feito comtmux set-option remain-on-exit on
rmanna 14/06
1
@azmeukset-option -g remain-on-exit on bind-key r respawn-pane
HappyFace
1

Aqui está um exemplo estendido usando o send-keysmétodo recomendado por @Caleb

#!/bin/sh
tmux start-server
tmux new-session -d -n 'mywindowname'
tmux send-keys -t mywindowname 'cd notes' Enter 'vim whiteboard/tasks.md' Enter
tmux new-window -d -n 'secondwindowname' # this -d prevents focus from changing to the new window
tmux -2 attach-session -d
jtpereyda
fonte