tmux はキーバインドを使用してパイプ/コマンドチェーンを実行します

tmux はキーバインドを使用してパイプ/コマンドチェーンを実行します

tmux でシェルのようにコマンド チェーンを実行するにはどうすればよいでしょうか。成功に基づいて複数のコマンドを実行したいです。ターミナル (またはコマンド バー) にエコー出力したいです。

たとえば、次のように設定を再読み込みするキーバインディングがあります。また、それが起こったことをユーザーに伝えるために出力したいのですreloadedが、これをトリガーするとエラーが表示されますsource-file

bind r source-file ~/.tmux.conf   # works fine
bind r source-file ~/.tmux.conf && echo reloaded.   # doesn't work shows source-file help in command bar.
bind r source-file ~/.tmux.conf; echo reloaded.  # doesn't work, says not recognized 'echo'

このコマンドはどのシェルで呼び出されますか? デフォルトのシェル、現在のシェル、またはタブ/ウィンドウ/ペインで実行されているフォアグラウンド プログラムでしょうか? 私のデフォルトのシェルは ですfish

答え1

後に指定するものはbind r1つ以上である必要がありますtmux コマンド(引数の有無は問いません)。はsource-file ~/.tmux.conf有効なtmuxコマンドです。source-file ~/.tmux.conf && echo reloaded.は有効ではありません。複数のtmuxコマンドを実行するには、;(場合によっては の形式で)を使用する必要があります\;tmux キーを複数のコマンドにバインドする詳細については、こちらを参照してください。ただし、echoこれは tmux コマンドではありません。

しかし、run-shelltmuxコマンドを実行すると、任意シェル内のコード。私のテストでは、シェルは であると示されていますsh(コマンド インタープリタが でない場合でもsh)。マニュアルでは次のように確認されています。

シェルコマンド引数はsh(1)コマンドです。

source-fileシェルから実行するには、を呼び出す必要がありますtmux source-file …。 のこの行は.tmux.conf機能するはずです:

bind-key r run-shell 'tmux source-file ~/.tmux.conf && echo reloaded'

シェルからの出力 (echoこの場合は から) は、表示モードで表示されます。個人的には、短いメッセージをステータス ラインに表示したいので、次のバリエーションを使用します。

bind-key r run-shell 'tmux source-file ~/.tmux.conf && tmux display-message reloaded'

このバインディングをトリガーすると何が起こるかを分析することは、非常に教育的です。tmux サーバーと通信する tmux クライアントが存在します。クライアントが適切なキー シーケンス を受信すると、prefixrサーバーに通知し、サーバーはバインディングに従って動作し、シェルを実行します。シェルは、同じ tmux サーバーと通信する別の tmux クライアントを実行し、コマンドを実行させますsource-file …。次に、シェルは、サーバーと通信して を実行するように指示する別の tmux クライアントを実行しますdisplay-message …

言い換えると、サーバーは、同じサーバーに何かを実行するように指示するクライアントを生成するコードを実行します。

元の作業バインディング ( bind r source-file ~/.tmux.conf) ははるかに単純で、サーバーがsource-file …直接実行されます。

source-fileとは tmux コマンドなのでdisplay-message、シェルを起動せずにキー入力で両方を実行できます。

bind-key r source-file ~/.tmux.conf \; display-message reloaded

ここではシェルの\;ように動作すると予想されますが、実際は のようになります。マニュアル;&&:

各コマンドは改行またはセミコロン(;)で終了します。セミコロンで区切られたコマンドは、コマンドシーケンス- シーケンス内のコマンドでエラーが発生した場合、後続のコマンドは実行されません。

したがって、この最後のバインディングはあなたのケースにちょうど良いようです。不要なシェルは生成されません。それでも、追加の tmux クライアントも含めて、 経由で何でも実行できることは知っておくとよいでしょうrun-shell

2 つのアプローチを組み合わせることができます。

bind-key r source-file ~/.tmux.conf \; run-shell '#some complex logic here or whatever'

そこにはif-shell。 例:

bind-key r if-shell 'tmux source-file ~/.tmux.conf' 'display-message reloaded' 'display-message "reload failed"'

関連情報