web-dev-qa-db-ja.com

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

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

Bashスクリプトからこれを行うにはどうすればいいですか?

知っている

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

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

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

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

53
cjroebuck

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コマンドでは、実際に文字を入力する必要があります。 Entertmuxに、ウィンドウに改行キーを送るように指示します。 (当然、すべてのコマンドは Enter キー。)


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

72
Chris Johnsen

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

これで、一連のキーを引数として取得してターゲットペインに簡単に送信するための簡単なBash関数を作成できます。

9
Aleksey Gureiev