1. ホーム
  2. bash

tmuxを使ったBashスクリプトによる4ペインウィンドウの起動

2023-11-16 07:47:35

質問

どなたか tmux , bash そして exec ? 私は4ペインのウィンドウでtmuxセッションをセットアップしようとしています。理想的には、私は3つのペインでコマンドを実行したいです:例えば、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 となっていて、何が何だかよくわからないのですが...。

で何が起こっているのか、誰か一般的な説明をするのを手伝ってくれませんか? tmuxbash そして exec の2種類があります。

どのように解決するのですか?

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

初期コマンド" をシェルの履歴に入れるには、コマンドのキーストロークを直接 $SHELL のインスタンスに直接与える必要があります (もちろん、起動された後です)。他のコンテキストでは、小さな Expect プログラムを使って $SHELL のインスタンスを生成し、それにキーストロークを与え、次に interact を使用して、tty を 期待する -スポーンされた $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