実行中のtmuxセッションでコマンドを実行またはtmuxペインに送信します


60

名前付きtmuxセッションにアタッチし、そのセッションでウィンドウ(またはペイン)を選択し、選択したウィンドウ(またはペイン)でコマンドを実行するシェルスクリプトを作成します。

これをbashスクリプトからどのように行うのですか?

知っている

tmux new-window -n:mywindow 'exec something'

新しく作成したウィンドウにコマンドを送信できますが、次のようなものが必要です

tmux select-window -t:0 'my command'

私は使用できると思いますsend-keysが、実行されるコマンドまたはコマンドのリストを受け取るものがあるはずです。

回答:


82

tmuxペインは、単一のpty(疑似tty)のインターフェースです。分割されていないウィンドウには単一のペインがあります。分割ウィンドウには複数のペインがあります。

tmuxは、最初のコマンドで開始されたペインに追加のプロセスを追加する方法を提供しません。その端末にジョブ制御1を提供するのは、その初期コマンドのプロセス(通常はシェル)次第です。

ペインで現在実行されているものをすべて上書きしたい場合はrespawn-pane -k、既存のコマンドを強制終了して新しいコマンド(たとえば、respawn-pane -t sessionname:0.4 -k 'some -new command')に置き換えることができます。

ただし、ペインで現在実行されているものをすべて維持したい場合は、単に「で入力」するだけのより良いオプションはありませんsend-keys

次のようにスクリプトを作成します(最後にアタッチします。そうしないと、スクリプトは続行する前にデタッチするのを待つだけです)。

session=whatever
window=${session}:0
pane=${window}.4
tmux send-keys -t "$pane" C-z 'some -new command' Enter
tmux select-pane -t "$pane"
tmux select-window -t "$window"
tmux attach-session -t "$session"

send-keysコマンドでは、実際に文字E n t e rを入力してtmux、改行キーをウィンドウに送信するように指示する必要があること に注意してください。(当然、すべてのコマンドはEnterキーで終了します。)


1ジョブ制御は、制御端末としてttyを使用する単一セッションの複数のプロセスグループ間の調停です。すなわち、Ctrl+ Zキー、一時停止、およびjobsfg、およびbgシェルコマンド。


2
これをありがとう!私は入れて#{session_name}:#{window_index}.#{pane_index}、私はすぐにコマンドを送信するためにどのペイン見ることができるように、私のステータスラインに。
支払済みのオタク

11

C-m代わりに使用できますEnter。それは同じことです。また、またはtmuxを使用して、右/左ペインに簡単に送信できます。また、別のウィンドウのペインをアドレス指定する場合は、ウィンドウ番号とピリオドを接頭辞として付けるだけです。-t right-t left-t 0.right

これで、単純なBash関数を記述して、キーのシーケンスを引数として取得し、それをターゲットペインに簡単に送信できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.