web-dev-qa-db-ja.com

画面で、単一の画面セッション内のすべての仮想ターミナルウィンドウにコマンドを送信するにはどうすればよいですか?

起動時に、単一の画面セッション内に複数のウィンドウを作成する方法を知っています。

しかし、それらを稼働させたら、現在フォーカスされているウィンドウだけでなく、開いているすべてのウィンドウに入力を送信する方法はありますか?

21
Aaron Fi

私はこれを行うための良いチュートリアルをここで見つけました:

http://blog.cone.be/2009/11/24/gnu-screen-nethack-different-screen-windows-sending-commands-to-all-screen-windows/

投稿から:

複数のウィンドウに慣れると、開いているこれらのウィンドウのいくつかに同じコマンドを送信したいという状況に遭遇する可能性があります。 Screenは、これを行うための「at」コマンドを提供します。まず、コマンドラインモードを開く必要があります。

C-a :(コロン)コマンドラインモードに入ります。

このようにして、コマンドを1回入力できますが、それでも個別のウィンドウに入る必要があります。しかし、もっと良い方法があります。例として、すべてのウィンドウに「ls-l」を送信します。

「#」のもの「ls-l ^ M」で

このコマンドはほとんど読めないので、バラバラにしましょう!最初の部分は「[識別子] [#| * |%]コマンド」です。 atコマンドは、識別子で指定したすべてのウィンドウにテキストパラメータを送信します。 %を使用して、ウィンドウ名または番号に#、ユーザー名に*、またはディスプレイのいずれかに条件を一致させることができます。次の部分は、選択したウィンドウで実行するコマンドです。 「stuff」を使用して、実行するコマンドを選択したウィンドウの入力バッファに詰め込みます。ものは本当に簡単です。それは単にあなたがパラメータとして与えた文字列を詰め込むだけです。次の問題はコマンドです。むしろそれを実行させる!コマンドの後に「Enter」を付ける画面を表示するには、コマンドを実行するには、最後に「^ M」を追加します。これを使用すると、入力にlsを送信するだけでなく、さらに多くのことができます。名前の変更、ウィンドウの移動など、画面コマンドはすべて「at」と組み合わせて使用​​できます。

33
Corey Henderson

この遅れた返信で申し訳ありませんが、tmuxよりもscreenの方が適している可能性があります。 tmuxで、次を押す必要があります:C-b :コマンドモードに入り、入力します:setw synchronize-panes (あるいは単に setw sync<Tab>オートコンプリートを使用)。このコマンドは、ペイン間(1つの分割画面の領域、同時に表示)の同期を有​​効にしますが、ウィンドウ間(完全、分割ではない画面)の同期は有効にしないことに注意してください。

9
minaev

選択したウィンドウのみに送信することもできます(マルチキャスト)。

  1. コンベンション:ウィンドウタイトルの最初の文字にブロードキャストフラグの意味を与えます。例えば。タイトルが「。」で始まる場合次に、ウィンドウはブロードキャストをリッスンします。それ以外の場合はリッスンしません。
  2. 必要に応じてタイトルを設定してください。

    screen -S SessionName -p 0 -X title "remote_0"     # window 0: ignore multicast
    screen -S SessionName -p 1 -X title ".remote_1"    # window 1: listen to multicast
    
  3. 内容を送信画面のatコマンドでリスナーに

    screen -S SessionName -X at ".#" stuff "date
    "
    
  4. 注:上記の最後の二重引用符は、^ Mが送信されることを保証します(Cr)。

  5. この方法で、ウィンドウタイトルに基づいてマルチキャストを有効/無効にできます。

6
TipTop