web-dev-qa-db-ja.com

tmuxを使用して4ペインウィンドウを起動するBashスクリプト

誰がtmuxbash、およびexecで何が起こっているのか説明できますか? 4ペインウィンドウでtmuxセッションを設定しようとしています。理想的には、3つのペインでコマンドを実行したいと思います。 a Ruby ThinサーバーといくつかのRubyデーモン。これは私がこれまで持っているものです。

_~/.bin/tmux-foo_:

_#!/bin/sh

tmux new-session -d -s foo 'exec pfoo "bundle exec thin start"'
tmux rename-window 'Foo'
tmux select-window -t foo:0
tmux split-window -h 'exec pfoo "bundle exec compass watch"'
tmux split-window -v -t 0 'exec pfoo "rake ts:start"'
tmux split-window -v -t 1 'exec pfoo'
tmux -2 attach-session -t foo
_

_~/.bin/pfoo_:

_#!/bin/bash
cd ~/projects/foo
rvm use ree

# here I want to execute command1 2 3 or 4...

exec $Shell
_

それはすべて機能します...しかし、シンサーバーを実行している最初のペインで_ctlr-c_すると、シンサーバーを停止してシェルに戻ります。ただし、コマンドは履歴にはありません。つまり、上キーを押しても_bundle exec thin start_コマンドを取得できません... bash履歴から他のコマンドを取得します。これらのスクリプトを整理して、bash履歴にコマンドを取得する方法があるかどうか疑問に思っています。

また... exec、_exec $Shell -s ..._、_exec $Shell -s ... -I_の多くの組み合わせを試しましたが、何が起こっているのかよくわかりません...

ここでtmuxbashexecで何が起こっているかの一般的なアイデアを説明するのを手伝ってもらえますか?

62
Aaron Gibralter

他の人が述べたように、コマンドはシェルスクリプトによって実行されていますbefore$Shell;を起動します; $Shellのインスタンスが、起動する前に親が何を実行したかを知る一般的な方法はありません。

「初期コマンド」をシェルの履歴に入れるには、コマンドキーストロークを$Shell自体のインスタンスに直接供給する必要があります(もちろん、開始後)。他のコンテキストでは、小さなExpectプログラムを使用して$Shellのインスタンスを生成し、それにキーストロークを供給し、interactを使用してttyをexpect-に結び付けることをお勧めします。 $Shellが生成されました。

ただし、tmuxのコンテキストでは、send-keysを使用できます。

#!/bin/sh

tmux new-session -d -s foo 'exec pfoo'
tmux send-keys 'bundle exec thin start' 'C-m'
tmux rename-window 'Foo'
tmux select-window -t foo:0
tmux split-window -h 'exec pfoo'
tmux send-keys 'bundle exec compass watch' 'C-m'
tmux split-window -v -t 0 'exec pfoo'
tmux send-keys 'rake ts:start' 'C-m'
tmux split-window -v -t 1 'exec pfoo'
tmux -2 attach-session -t foo
59
Chris Johnsen

tmuxinator では、これをNice yamlファイルで指定できます。あなたの場合、あなたが持つことができます:

# ~/.tmuxinator/foo.yml
# you can make as many tabs as you wish...

project_name: foo
project_root: ~/projects/foo
rvm: ree
tabs:
  - main:
      layout: tiled
      panes:
        - bundle exec thin start
        - bundle exec compass watch
        - #empty, will just run plain bash
        - rake ts:start

もちろん、追加のウィンドウなどを持つことができます。

14
Hamish Downer

コマンドを実行してから、対話型シェルに入ります。対話型のシェルではなく、スクリプトから実行されたコマンドは履歴に記録されません。シェルの入力をTIOCSTI for "terminal ioctl():stuff input")であったウィンドウに詰め込む方法(技術用語:)が本当に必要です。

tmuxを使用すると、バッファを使用するように見えます。 (未検証)の線に沿った何か

#! /bin/bash
cd ~/projects/foo
rvm use ree

if [[ $# != 0 ]]; then
  tmux set-buffer "$(printf '%s\n' "$*")" \; paste-buffer -d
fi

exec ${Shell:-/bin/sh}
3
geekosaur