Como dividir uma nova janela e executar um comando nesta nova janela usando o tmux?

28

eu tentei

tmux -c "shell command" split-window

mas parece não funcionar.

Usando tmux split-window, pode-se dividir uma nova janela.

ATUALIZAÇÃO :

O uso tmux split-window 'exec ping g.cn'pode executar o comando ping, mas quando parado, a nova janela será fechada.

atupal
fonte
4
man tmux | less -p remain-on-exit...
jasonwryan

Respostas:

38

Usar:

tmux split-window "shell command"

O split-windowcomando tem a seguinte sintaxe:

 split-window [-dhvP] [-c start-directory] [-l size | -p percentage] [-t
         target-pane] [shell-command] [-F format]

(de man tmux, seção "Janelas e painéis"). Observe que a ordem é importante - o comando deve vir após qualquer uma das opções anteriores que aparecem e deve ser um argumento único; portanto, é necessário citá-lo se houver espaços.


Para comandos como ping -cesse terminam rapidamente, você pode definir a remain-on-exitopção primeiro:

tmux set-option remain-on-exit on
tmux split-window 'ping -c 3 127.0.0.1'

O painel permanecerá aberto após a pingconclusão, mas será marcado como "morto" até você fechá-lo manualmente.

Se você não deseja alterar as opções gerais, existe outra abordagem. O comando é executado sh -ce você pode explorar isso para manter a janela ativa no final:

tmux split-window 'ping -c 3 127.0.0.1 ; read'

Aqui você usa o readcomando shell para aguardar uma nova linha de entrada do usuário após a conclusão do comando principal. Nesse caso, a saída do comando permanecerá até você pressionar Enterno painel e, em seguida, fechará automaticamente.

Michael Homer
fonte
Obrigado Michawl Homer :-). Eu também achei isso agora. Mas como manter a nova janela fechada?
atupal 29/08/14
@atupal: veja editar - definir remain-on-exitou usar cmd ; read.
Michael Homer
2

bash --rcfile

Essa técnica abre um novo shell, executa comandos e o deixa lá após a conclusão dos comandos:

tmux-split-cmd() ( tmux split-window -dh -t $TMUX_PANE "bash --rcfile <(echo '. ~/.bashrc;$*')" )
tmux-split-cmd 'cd; pwd; ping google.com'

Ou se o comando não tiver caracteres especiais de terminal, como ;apenas:

tmux-split-cmd ping google.com

Isso usa:

Outra variante interessante é:

tmux-split-cmd-uniq() (
  if [ "$(tmux list-panes | wc -l | cut -d' ' -f1)" -ne 1 ]; then
    tmux kill-pane -t 1
  fi
  tms "$@"
)

que mata a divisão anterior, se ela já existir, e ajuda a manter apenas uma divisão extra o tempo todo.

Ciro Santilli adicionou uma nova foto
fonte