74

tmux、、、で何が起こっているのかを誰かが説明するのbashを手伝ってもらえますexecか?4ペインウィンドウでtmuxセッションを設定しようとしています。理想的には、3つのペインでコマンドを実行したいと思います。たとえば、RubyThinサーバーといくつかの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

誰かがここで何が起こっtmuxているのかについての一般的な考えを説明するのを手伝ってもらえますか?bashexec

4

4 に答える 4

71

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

「初期コマンド」をシェル履歴に取り込むには、コマンドのキーストロークをそれ自体のインスタンスに直接フィードする必要があります$SHELL(もちろん、コマンドが開始された後)。他のコンテキストでは、小さなExpectプログラムを使用して、のインスタンスを生成し、$SHELLそれにキーストロークをフィードしてから、を使用interactしてttyをexpect -spawnedに結び付けることをお勧めし$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
于 2011-10-11T02:43:49.313 に答える
19

tmuxinatorを使用すると、これを素敵な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

もちろん、追加のウィンドウなどを用意することもできます。

于 2012-04-18T20:01:19.630 に答える
4

コマンドプロンプトに次のように入力すると、4つのtmuxパネルが自動的に開きます(これが問題ではないことはわかっていますが、これは私が投稿したものよりもいくらか簡単に見えます):

    tmux new-session \; \split-window -v \; \split-window -h \; \select-pane -t 0 \; \split-window -h

これで、そのコマンドを使用して、好きなスクリプト言語で使用できます[perl ...およびおそらく他の言語を使用する場合は、エスケープ文字{バックスラッシュ文字}を2倍にする必要があります]。

これにより、新しいtmuxパネルで後続のコマンドが実行され、最初のコマンドに戻り、最後に分割されます。

于 2020-10-31T22:21:21.080 に答える
3

コマンドを実行してから、対話型シェルに入ります。対話型シェルではなく、スクリプトから実行されたコマンドは、履歴に記録されません。TIOCSTIシェルの「terminalioctl():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}
于 2011-03-27T05:26:09.867 に答える