¿Cómo dividir una nueva ventana y ejecutar un comando en esta nueva ventana usando tmux?

28

Yo he tratado

tmux -c "shell command" split-window

pero no parece funcionar.

Usando tmux split-window, uno puede dividir una nueva ventana.

ACTUALIZACIÓN :

El uso tmux split-window 'exec ping g.cn'puede ejecutar el comando ping, pero cuando se detiene, la nueva ventana se cerrará.

atupal
fuente
44
man tmux | less -p remain-on-exit...
jasonwryan

Respuestas:

38

Utilizar:

tmux split-window "shell command"

El split-windowcomando tiene la siguiente sintaxis:

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

(de la man tmuxsección "Ventanas y paneles"). Tenga en cuenta que el orden es importante: el comando debe aparecer después de cualquiera de las opciones anteriores que aparecen y debe ser un argumento único, por lo que debe citarlo si tiene espacios.


Para comandos como ping -cese terminan rápidamente, puede configurar la remain-on-exitopción primero:

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

El panel permanecerá abierto después de pingfinalizar, pero se marcará como "muerto" hasta que lo cierre manualmente.

Si no desea cambiar las opciones generales, hay otro enfoque. El comando se ejecuta con sh -c, y puede explotarlo para que la ventana permanezca viva al final:

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

Aquí usa el readcomando shell para esperar una nueva línea ingresada por el usuario una vez que el comando principal ha finalizado. En este caso, la salida del comando permanecerá hasta que presione Enterel panel y luego se cerrará automáticamente.

Michael Homer
fuente
Gracias Michawl Homer :-). Lo encontré también justo ahora. Pero, ¿cómo evitar que la nueva ventana se cierre?
atupal
@atupal: ver edición, ya sea establecer remain-on-exito usar cmd ; read.
Michael Homer
2

bash --rcfile

Esta técnica abre un nuevo shell, ejecuta comandos y lo deja allí después de que finalizan los comandos:

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

O si el comando no tiene caracteres terminales especiales como ;solo:

tmux-split-cmd ping google.com

Esto usa:

Otra variante interesante es:

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 la división anterior si ya existe, y ayuda a mantener solo una división adicional en todo momento.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
fuente