Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to start tmux with several windows in different directories?

Tags:

bash

tmux

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?

like image 895
Michael Härtl Avatar asked Dec 16 '11 16:12

Michael Härtl


People also ask

How do I make multiple windows in tmux?

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.

How do I run multiple tmux sessions?

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.

How do I switch between tmux Windows?

Ctrl+b, let go of Ctrl, Letf / Right / Up / Down will switch active panes.


2 Answers

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.

like image 132
Will Avatar answered Oct 17 '22 18:10

Will


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):

  • Put 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.
  • Once you know which file is being processed when the errors occur, add more debug outputs around each “major block” or line to narrow down the responsible section/line.
  • The errors may not actually be in your startup file itself, but in a script that it runs.

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).

like image 28
Chris Johnsen Avatar answered Oct 17 '22 18:10

Chris Johnsen