I want to use a script to open a tmux session with 6 windows, each in a different directory. I started with a script I found and tried this first:
tmux new-session -s xyz -n etc -d 'cd /etc' tmux new-window -t xyz:1 -n var 'cd /var/log'
But I soon found out that this will not work as I expected — the window will be closed after the shell command completes.
So my next idea was to start a new shell like this:
tmux new-session -s xyz -n etc -d 'cd /etc; bash -i' tmux new-window -t xyz:1 -n var 'cd /var/log; bash -i' tmux new-window -t xyz:2 -n var2 'cd /var/log; bash -i' tmux new-window -t xyz:3 -n var3 'cd /var/log; bash -i' tmux new-window -t xyz:4 -n var4 'cd /var/log; bash -i' tmux new-window -t xyz:5 -n var5 'cd /var/log; bash -i' tmux new-window -t xyz:6 -n var6 'cd /var/log; bash -i' tmux select-window -t xyz:1 tmux -2 attach-session -t xyz
This almost works. But if I start more than about 4 windows, I frequently see the following bash errors in one of the windows after startup:
bash: [: =: unary operator expected bash: [: too many arguments bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: too many arguments bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: =: unary operator expected bash: [: =: unary operator expected
I have no idea why this happens, but I still think that I’m not doing this right. Is there a better way to set up a tmux session over several directories?
To get from one pane to another, press Ctrl+B followed by O (as in other). The border around the pane changes color based on your position, and your terminal cursor changes to its active state.
To create multiple windows, you need at least one tmux session running. You can simply type CTRL + b, let go of both keys and type 'c'. This will open up a new terminal. At the bottom, you can see that there are now multiple windows (0, 1, 2) in the session.
Ctrl+b, let go of Ctrl, Letf / Right / Up / Down will switch active panes.
Tmuxinator is also really good for this. Basically you create setup files like so:
# ~/.tmuxinator/project_name.yml # you can make as many tabs as you wish... project_name: Tmuxinator project_root: ~/code/rails_project socket_name: foo # Not needed. Remove to use default socket rvm: 1.9.2@rails_project pre: sudo /etc/rc.d/mysqld start tabs: - editor: layout: main-vertical panes: - vim - #empty, will just run plain bash - top - shell: git pull - database: rails db - server: rails s - logs: tail -f logs/development.log - console: rails c - capistrano: - server: ssh me@myhost
Then you can start a new session with:
mux project_name
I've been using it for a while and have had a good experience for the most part.
The shell errors are probably due to some problem in your startup files (or something they run).
As shellter commented, temporarily including the command set -vx
early in your startup sequence is a good way to find out where the errors are occurring.
If you find the -vx
output too verbose, you could try “printf debugging” (manually adding debug statements to your startup files until you can narrow down exactly which lines are causing the errors):
echo start of .bashrc
and echo end of .bashrc
at the start/end of your .bashrc
to see if the error occurs during your .bashrc
. If not, instrument your other startup files: .bash_profile
/.bash_login
/.profile
. If the errors happen before that file, then the problem may be in /etc/profile
.Note: These debug additions need to be temporary since they will cause problems if you ever use a program that makes automated logins (e.g. rsync, SSH-based Git access, etc.) since these programs expect a “clean” connection without such debugging noise present.
There should be no need to use cd
command like that in the shell-command argument given to either tmux new-session
or tmux new-window
.
A new window will “inherit”† the current working directory when using new-session
and new-window
from the command line (i.e. when done through the tmux
binary, instead of via a binding or at a tmux-:
prompt). According to the CHANGES file, it looks like this has been the case since tmux 0.6 (at least for new-window
).
† This is tmux-mediated inheritance, not the parent–child inheritance that is the usual mechanism for passing along the cwd.
This script works for me with tmux 1.5:
#!/bin/bash # var for session name (to avoid repeated occurences) sn=xyz # Start the session and window 0 in /etc # This will also be the default cwd for new windows created # via a binding unless overridden with default-path. cd /etc tmux new-session -s "$sn" -n etc -d # Create a bunch of windows in /var/log cd /var/log for i in {1..6}; do tmux new-window -t "$sn:$i" -n "var$i" done # Set the default cwd for new windows (optional, otherwise defaults to session cwd) #tmux set-option default-path / # Select window #1 and attach to the session tmux select-window -t "$sn:1" tmux -2 attach-session -t "$sn"
This might also (as a side-effect) alleviate your shell startup errors since the way tmux starts a shell is different from a plain bash -i
(it is more akin to bash -l
, which uses your .bash_profile
/.bash_login
/.profile
instead of (just) your .bashrc
).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With