53

I want to write a shell script which will attach to a named tmux session, select a window (or pane) in that session and run a command in that selected window (or pane).

How do I do this from a bash script?

I know

tmux new-window -n:mywindow 'exec something'

allows me to send commands to a freshly created window, but I need something like

tmux select-window -t:0 'my command'

I suppose I could use send-keys but seems like there should be something that takes a command or list of commands that get run.

migrated from stackoverflow.com Oct 24 '12 at 16:24

This question came from our site for professional and enthusiast programmers.

73

Each tmux pane is an interface for a single pty (pseudo tty). Non-split windows have a single pane; split windows have multiple panes.

tmux does not supply a way to add extra processes to a pane once it has been started with its initial command. It is up to that initial command’s process (usually a shell) to supply job control1 for that terminal.

If you want to clobber whatever is currently running in the pane, you can use respawn-pane -k to kill the existing command and replace it with a new one (e.g., respawn-pane -t sessionname:0.4 -k 'some -new command').

But, if you want to maintain whatever is currently running in the pane, then there may be no better option that simply “typing at it” with send-keys.

You might script it like this (attach last, because otherwise the script will just wait for you to detach before continuing):

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

Note that, on the send-keys command, you should actually type the letters E n t e r, to tell tmux to send a newline key to the window.  (Naturally, every command ends with the Enter key.)


1Job control is the arbitration between multiple process groups of a single session that uses the tty as its controlling terminal. I.e., the Ctrl+Z suspend key, and the jobs, fg, and bg shell commands.

  • 1
    Thanks for this! I put #{session_name}:#{window_index}.#{pane_index} in my status line so I can quickly see which pane to send commands to. – a paid nerd May 24 '17 at 23:32
9

You can use C-m instead of Enter. It's the same thing. Also, tmux makes it easy to send to the right / left pane by using -t right or -t left. And if you want to address a pane in another window, just prefix it with the window number and period, like -t 0.right.

Now you can write a simple Bash function to get the sequence of keys as argument and send it over to the target pane easily.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.