
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 r
1つ以上である必要がありますtmux コマンド(引数の有無は問いません)。はsource-file ~/.tmux.conf
有効なtmuxコマンドです。source-file ~/.tmux.conf && echo reloaded.
は有効ではありません。複数のtmuxコマンドを実行するには、;
(場合によっては の形式で)を使用する必要があります\;
。tmux キーを複数のコマンドにバインドする詳細については、こちらを参照してください。ただし、echo
これは tmux コマンドではありません。
しかし、run-shell
tmuxコマンドを実行すると、任意シェル内のコード。私のテストでは、シェルは であると示されています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"'