web-dev-qa-db-ja.com

異なるディレクトリの複数のウィンドウでtmuxを起動するにはどうすればよいですか?

スクリプトを使用して、それぞれ異なるディレクトリにある6つのウィンドウでtmuxセッションを開きます。 見つけたスクリプト で始め、最初にこれを試しました:

tmux new-session -s xyz   -n etc -d 'cd /etc'
tmux new-window  -t xyz:1 -n var    'cd /var/log'

しかし、私はすぐにこれが期待どおりに機能しないことを発見しました。シェルコマンドが完了するとウィンドウが閉じられます。

だから私の次のアイデアは、このような新しいシェルを開始することでした:

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

これはほとんど機能します。しかし、約4つ以上のウィンドウを起動すると、起動後にいずれかのウィンドウで次のbashエラーが頻繁に表示されます。

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

なぜこれが起こるのかわかりませんが、私はまだこれが正しいとは思いません。複数のディレクトリでtmuxセッションを設定するより良い方法はありますか?

33
Michael Härtl

シェルエラーは、おそらくスタートアップファイル(またはそれらが実行するもの)に問題があるためです。

シェルターがコメントしたように、起動シーケンスの初期にコマンド_set -vx_を一時的に含めることは、エラーが発生している場所を見つけるための良い方法です。
_-vx_の出力が冗長すぎる場合は、「printfデバッグ」を試すことができます(エラーの原因となっている行を正確に絞り込むまで、スタートアップファイルにデバッグステートメントを手動で追加します)。

  • _echo start of .bashrc_の開始/終了に_echo end of .bashrc_と_.bashrc_を入れて、_.bashrc_中にエラーが発生するかどうかを確認します。そうでない場合は、他のスタートアップファイルをインストゥルメントします:_.bash_profile_/_.bash_login_/_.profile_。そのファイルの前にエラーが発生した場合、問題は_/etc/profile_にある可能性があります。
  • エラーが発生したときにどのファイルが処理されているかがわかったら、各「主要ブロック」または行の周りにデバッグ出力を追加して、責任のあるセクション/行を絞り込みます。
  • エラーは実際には起動ファイル自体にあるのではなく、実行するスクリプトにある可能性があります。

注:これらのデバッグの追加は、自動ログインを行うプログラム(rsync、SSHベースのGitアクセスなど)を使用すると問題が発生するため、一時的なものである必要があります。これらのプログラムは、そのようなデバッグノイズが存在しない「クリーンな」接続を期待しています。


_tmux new-session_または_tmux new-window_に与えられたShell-command引数でcdコマンドを使用する必要はありません。

新しいウィンドウは「継承」します コマンドラインから_new-session_および_new-window_を使用するときの現在の作業ディレクトリ(つまり、バインディングまたはの代わりにtmuxバイナリを介して実行するとき) tmux-_:_プロンプト)。 CHANGESファイルによると、tmux0.6以降(少なくとも_new-window_の場合)にそうであるようです。

 これは、tmuxを介した継承であり、cwdを渡すための通常のメカニズムである親子継承ではありません。

このスクリプトはtmux1.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"
_

これは(副作用として)シェルの起動エラーを軽減する可能性もあります。これは、tmuxがシェルを起動する方法が_bash -i_とは異なる(より似ているため) _bash -l_。(ちょ​​うど)_.bash_profile_)の代わりに_.bash_login_/_.profile_/_.bashrc_を使用します。

19
Chris Johnsen

Tmuxinator もこれに適しています。基本的に、次のようなセットアップファイルを作成します。

# ~/.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

次に、次のコマンドで新しいセッションを開始できます。

mux project_name

私はしばらくそれを使ってきましたが、ほとんどの部分で良い経験をしました。

30
Will

代わりに Teamocil を使用できます。 Teamocilは、YAMLファイルを使用してtmuxでセッション、ウィンドウ、およびペインを自動的に作成するために使用されるシンプルなツールです。

9
Sam Stoelinga

Rubyをインストールしない人のために tmuxp はPythonで利用でき、TeamocilとTmuxinatorスタイルの両方の設定ファイルを(yamlとjsonの両方で)サポートします。

言うまでもなく、すべての背後に非常に甘いライブラリがあります https://github.com/tony/libtmux


 pip install --user tmuxp

〜/ .local/bin /を$ =に追加しますpythonユーザーインストールプログラム

-

# ~/.tmuxp/workbench.yaml
session_name: workbench
windows:
  - name: workbench
    layout: main-vertical
    panes:
      - vim
      - pane
      - pane

-

 tumxp load workbench
6
ThorSummoner

私の人生では-cを機能させることができなかったので、sendを介して実行されるスクリプトを作成することでこれを回避しました。これにより、各tmuxセッションで必要な処理を実行できます。他の人に役立つ場合は、次のとおりです。

#!/bin/bash
TMUX_SESSION=mystuff
TOP=~/mydir

tmux new-session -s "$TMUX_SESSION" -n $(pwd) -d

launch_my_window()
{
    WINDOW=$1
    NAME=$2
    SUBDIR=$3

    SCRIPT=$TMPDIR/tmux.sh.$WINDOW.$NAME
    tmux new-window -t "$TMUX_SESSION:$WINDOW" -n "$NAME"
    cat >$SCRIPT <<%%
cd $TOP/$SUBDIR
# do more stuff here
%%
    chmod +x $SCRIPT
    tmux send -t "$TMUX_SESSION:$WINDOW" $SCRIPT ENTER
    sleep 1
}

launch_my_window 1 "stuff"         subdir1
launch_my_window 2 "morestuff"     subdir2
launch_my_window 3 "yetmorestuff"  subdir3
#...

# Select window #1 and attach to the WINDOW
tmux select-window -t "$TMUX_SESSION:1"
tmux -2 attach-session -t "$TMUX_SESSION"
2
Neil McGill